zoukankan      html  css  js  c++  java
  • poj1733(并查集+离散化)

    题目大意:有一个长度为n的0,1字符串, 给m条信息,每条信息表示第x到第y个字符中间1的个数为偶数个或奇数个, 若这些信息中第k+1是第一次与前面的话矛盾, 输出k;

    思路:x, y之间1的个数为偶数个, 那么1~x 与1~y中1的个数奇偶性相同;若x,y间1的个数为奇数个,那么1~x与1~y中1的奇偶性相同。奇偶性相同的加入同一个并查集

    eg:数据范围大,先离散化

    #include<stdio.h>
    #include<algorithm>
    #define N 100006 
    using namespace std;  
    struct Node  
    {  
        int u,v;  
        char str[10];  
    }que[N];  
    int a[N*2],n,q,cnt;  
    int pre[N*2],r[N*2];  
    int Bin(int x)  
    {  
        int low=0,high=cnt-1,mid;  
        while(low<=high)  
        {  
            mid=(low+high)/2;  
            if(a[mid]==x) return mid;  
            if(a[mid]<x) low=mid+1;  
            else high=mid-1;  
        }  
        return 0;  
    }  
    int find(int x)  
    {  
        if(x!=pre[x])  
        {  
            int f=pre[x];  
            pre[x]=find(pre[x]);  
            r[x]=r[x]^r[f];  
        }  
        return pre[x];  
    }  
    int main()  
    {  
        while(scanf("%d",&n)!=EOF)  
        {  
            scanf("%d",&q);  
            cnt=0;  
            for(int i=0;i<q;i++)  
            {  
                scanf("%d%d%s",&que[i].u,&que[i].v,&que[i].str);  
                que[i].u--;  
                a[cnt++]=que[i].v;a[cnt++]=que[i].u;  
            }  
            sort(a,a+cnt);  
            cnt=unique(a,a+cnt)-a;  
            for(int i=0;i<cnt;i++) pre[i]=i,r[i]=0;  
            int ans=0;  
            for(int i=0;i<q;i++)  
            {  
                int u=Bin(que[i].u),v=Bin(que[i].v);  
                int ra=find(u),rb=find(v);  
                if(ra==rb)  
                {  
                    if(r[u]==r[v]&&que[i].str[0]=='o') break;  
                    if(r[u]!=r[v]&&que[i].str[0]=='e') break;  
                    ans++;  
                }  
                else  
                {  
                    if(que[i].str[0]=='o')  
                    {  
                        pre[ra]=rb;  
                        r[ra]=r[u]^r[v]^1;  
                    }  
                    else  
                    {  
                        pre[ra]=rb;  
                        r[ra]=r[u]^r[v];  
                    }  
                    ans++;  
                }  
            }  
            printf("%d
    ",ans);  
        }  
        return 0;  
    } 
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/Peper/p/8996923.html
Copyright © 2011-2022 走看看