小胖的奇偶
初看此题之时,只感觉麻烦至极,要从一个个关系中又推出其他关系,烦死人啊!!!然后在网上找到了一种神奇的用了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; }