poj 1733 Parity game
阿新 • • 發佈:2018-09-11
map hid str std lap har sca find 並查集
有n個數字,不知道具體是多少,給q個信息。
每個信息給一個區間[l,r]。並告訴這個區間的奇數有多少個,問第一個錯誤的信息是第幾個。
可以把每個區間的左端點-1的根看做右端點的根的根,用並查集維護一個到根點的1的個數是奇數還是偶數即可。
註意得離散化。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <map> using namespace std;View Codeconst int M = 2e5+7; int n,q,tot=0; int f[M],cnt[M],l[M],r[M],op[M],ls[M],num[M]; map<int,int> mp; void init(int n){//0==even for(int i=0;i<=n;i++) f[i]=i,cnt[i]=0; } int find(int x){ if(x==f[x]) return x; int tmp=f[x]; f[x]=find(f[x]); cnt[x]^=cnt[tmp]; return f[x]; } intmain(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d",&n); scanf("%d",&q); char s[10]; for(int i=1;i<=q;i++){ scanf("%d%d%s",&l[i],&r[i],s);l[i]-=1; if(s[0]==‘o‘) op[i]=1; else op[i]=0; ls[++tot]=l[i];ls[++tot]=r[i]; } sort(ls+1,ls+tot+1); tot=unique(ls+1,ls+tot+1)-ls-1; init(tot); for(int i=1;i<=q;i++){ int posl=lower_bound(ls+1,ls+tot+1,l[i])-ls,posr=lower_bound(ls+1,ls+tot+1,r[i])-ls; int fx=find(posl),fy=find(posr); if(fx==fy){ if((cnt[posl]+op[i])%2!=cnt[posr]){ printf("%d\n",i-1); return 0; } } else{ f[fy]=fx; cnt[fy]=(2+cnt[posl]-cnt[posr]+op[i])%2; } } printf("%d\n",q); return 0; }
poj 1733 Parity game