-
Parity game
- POJ - 1733
- 题意:
- 有一个长度为n的序列
- 给出Q条限制
- l,r,str str==odd 表示[l,r]区间内的数的和是奇数,否则为偶数
- 请你输出最小的不满足条件的编号-1(即最后一个满足的),如果全部满足,输出总数Q!
-
#include<iostream> #include<algorithm> using namespace std; #define maxn 100005 int n,l,r,q,cnt,ans; string str; int fa[maxn]; int val[maxn]; int ls[maxn]; struct node { int u,v,num; } a[maxn]; int fond(int x) { if(x==fa[x]) return x; int temp=fond(fa[x]); val[x]^=val[fa[x]]; return fa[x]=temp; } int main() { cnt=0; ios::sync_with_stdio(false); cin>>n>>q; for(int i=0; i<q; i++) { cin>>a[i].u>>a[i].v>>str; a[i].num=str[0]=='e'?0:1; a[i].u--; ls[cnt++]=a[i].u; ls[cnt++]=a[i].v; } sort(ls,ls+cnt); cnt=unique(ls,ls+cnt)-ls; for(int i=0; i<cnt; i++) { val[i]=0; fa[i]=i; } int i; for( i=0; i<q; i++) { int u=lower_bound(ls,ls+cnt,a[i].u)-ls; int v=lower_bound(ls,ls+cnt,a[i].v)-ls; int x=fond(u); int y=fond(v); if(x==y) { if(val[u]==val[v]) if(a[i].num==1) break; if(val[u]!=val[v]) if(a[i].num==0) break; } else if(x<y) { fa[y]=x; val[y]=val[u]^val[v]^a[i].num; } else if(x>=y) { fa[x]=y; val[x]=val[u]^val[v]^a[i].num; } } cout<<i<<endl; return 0; }
Parity game -离散化并查集
最新推荐文章于 2023-08-11 11:12:10 发布