-
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 -离散化并查集
最新推荐文章于 2025-12-18 20:39:03 发布
本文详细解析了Paritygame问题(POJ-1733),这是一个涉及区间奇偶性的编程挑战。通过使用并查集算法,文章展示了如何处理区间奇偶性限制,以找到序列中最小的不满足条件的编号。代码实现部分深入讲解了并查集的使用,包括查找、合并操作及路径压缩等关键步骤。
255

被折叠的 条评论
为什么被折叠?



