您的位置:首页 > 其它

POJ 1733 Parity game (并查集)

2014-05-06 22:07 288 查看
题目大意:

问m个问题里面 前面有多少个问题是不矛盾的。

问题是问区间里的 1 个个数是奇数还是偶数。

思路分析:

hdu 3038 是一个模型。

然后判断奇偶用异或就可以了。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int set[55555];
int sum[55555];

struct node
{
    int s,e;
    char op;
}Q[55555];
int x[55555];

int abs(int x)
{
    return x>0?x:-x;
}

int find(int x)
{
    if(x!=set[x])
    {
        int f=set[x];
        set[x]=find(set[x]);
        sum[x]=(sum[x]^sum[f]);
    }
    return set[x];
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int cnt=0;
        for(int i=0;i<=m*2;i++)set[i]=i,sum[i]=0;

        char str[10];
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%s",&Q[i].s,&Q[i].e,str);
            Q[i].op=str[0];
            Q[i].s--;

            x[cnt++]=Q[i].s;
            x[cnt++]=Q[i].e;
        }

        sort(x,x+cnt);
        int N=unique(x,x+cnt)-x;
        //printf("%d\n",N);
        int ans=0;

        //for(int i=0;i<N;i++)
       // printf("%d ",x[i]);
       // puts("");
        for(int i=0;i<m;i++)
        {
            //printf("---%d\n",i);
            int l=lower_bound(x,x+N,Q[i].s)-x;
            int r=lower_bound(x,x+N,Q[i].e)-x;

            int xx=find(l);
            int yy=find(r);

            int s;

            if(Q[i].op=='o')s=1;
            else s=0;

            if(xx==yy)
            {
                if(sum[l]==sum[r] && s==1)break;
                if(sum[l]!=sum[r] && s==0)break;
                ans++;
            }
            else
            {
                set[xx]=yy;
                if(s)
                sum[xx]=((sum[r]^sum[l])^s);
                else sum[xx]=(sum[r]^sum[l]);
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: