小胖的奇偶

初看此题之时,只感觉麻烦至极,要从一个个关系中又推出其他关系,烦死人啊!!!然后在网上找到了一种神奇的用了HAXU的解法,超级妙啊!!!

用f[x]表示了0到x的奇偶,然后设f[x+mod]=f[x]^1。这样就很好判断啊!!!太6了。。。

#include<bits/stdc++.h>
#define mod 1000007
using namespace std;
int haxu[mod],f[2*mod],n,m,k;
int ha(int x)
{
    int t = x % mod;
    while(haxu[t]!=-1 && haxu[t]!=x)
        t = (t+1) % mod;
    haxu[t]=x;
    return t;    
}
int find(int x)
{
    if(f[x]==x) return x;
    f[x]=find(f[x]);
    return f[x];
}
void he(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    f[fx]=fy;
}
int sum(int x,int y)
{
    if(find(x)==find(y))
        return 1;
    return 0;
}
main(){
    cin>>n>>m;
    for(int i=1;i<=2*mod;i++)
        f[i]=i; 
    memset(haxu,-1,sizeof(haxu));
    for(int i=0;i<m;i++)
    {
        int x,y;
        string c;
        cin>>x>>y>>c;
        int a=ha(x-1);
        int b=ha(y);
        if(c[0]=='e')
        {
            if(sum(a,b+mod))
            {
                cout<<i;
                return 0;
            }
            he(a,b);
            he(a+mod,b+mod);
        }
        else
        {
            if(sum(a,b))
            {
                cout<<i;
                return 0;
            }
            he(a,b+mod);
            he(a+mod,b);
        }
    }
    cout<<m;
}

 

posted @ 2017-08-18 11:18  cc123321  阅读(218)  评论(0编辑  收藏  举报