Parity game POJ - 1733 带权并查集加离散化

Parity game POJ - 1733

题目大意

依次给出若干段区间的奇偶描述,
描述不一定正确,
请找出第一条不正确的信息(和前面x条信息不冲突)。
输出x。

题解

带权并查集裸题。
奇偶的变化可以通过异或运算来简化。
细节:由于区间跨度很大,需要离散化处理

//#include
#include
#include
using namespace std;

const int maxn=1e4+5;
struct seg
{
    int l,r,v;
    seg(){}
    seg(int L,int R,int V)
    {
        l=L;r=R;v=V;
    }
}P[maxn];

int fa[maxn],val[maxn];
int num[maxn*2];

int findfa(int x)
{
    if(fa[x]==x)
    return x;
    int t=fa[x];
    fa[x]=findfa(fa[x]);
    val[x]^=val[t];
    return fa[x];
}
int main()
{
    int n,m,i;
    cin>>n>>m;
    int cnt=0;
    for(int i=1;i<=m;i++)
    {
        int l,r,v;
        string s;
        cin>>l>>r>>s;
        l--;
        v=(s=="even")?0:1;
        P[i]=seg(l,r,v);
        num[++cnt]=l;
        num[++cnt]=r;
    }
    sort(num+1,num+1+cnt);
    int len=unique(num+1,num+cnt+1)-num;
    for(i=1;i<len;i++)
    {
        fa[i]=i;val[i]=0;
        //cout<
    }
    for(i=1;i<=m;i++)
    {
        int x=lower_bound(num+1,num+len,P[i].l)-num;
        int y=lower_bound(num+1,num+len,P[i].r)-num;
        int fx=findfa(x),fy=findfa(y);
        if(fx==fy && (val[x]^val[y])!=P[i].v)
            break;
        else if(fx!=fy)
        {
            fa[fx]=fy;
            val[fx]=val[x]^P[i].v^val[y];
        }
    } 
    cout<<i-1<<endl;
    return 0;
}

你可能感兴趣的:(并查集,算法,数据结构,c++,acm竞赛)