POJ 1733 Parity game (并查集)
2014-05-06 22:07
288 查看
题目大意:
问m个问题里面 前面有多少个问题是不矛盾的。
问题是问区间里的 1 个个数是奇数还是偶数。
思路分析:
和 hdu 3038 是一个模型。
然后判断奇偶用异或就可以了。
问m个问题里面 前面有多少个问题是不矛盾的。
问题是问区间里的 1 个个数是奇数还是偶数。
思路分析:
和 hdu 3038 是一个模型。
然后判断奇偶用异或就可以了。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int set[55555]; int sum[55555]; struct node { int s,e; char op; }Q[55555]; int x[55555]; int abs(int x) { return x>0?x:-x; } int find(int x) { if(x!=set[x]) { int f=set[x]; set[x]=find(set[x]); sum[x]=(sum[x]^sum[f]); } return set[x]; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int cnt=0; for(int i=0;i<=m*2;i++)set[i]=i,sum[i]=0; char str[10]; for(int i=0;i<m;i++) { scanf("%d%d%s",&Q[i].s,&Q[i].e,str); Q[i].op=str[0]; Q[i].s--; x[cnt++]=Q[i].s; x[cnt++]=Q[i].e; } sort(x,x+cnt); int N=unique(x,x+cnt)-x; //printf("%d\n",N); int ans=0; //for(int i=0;i<N;i++) // printf("%d ",x[i]); // puts(""); for(int i=0;i<m;i++) { //printf("---%d\n",i); int l=lower_bound(x,x+N,Q[i].s)-x; int r=lower_bound(x,x+N,Q[i].e)-x; int xx=find(l); int yy=find(r); int s; if(Q[i].op=='o')s=1; else s=0; if(xx==yy) { if(sum[l]==sum[r] && s==1)break; if(sum[l]!=sum[r] && s==0)break; ans++; } else { set[xx]=yy; if(s) sum[xx]=((sum[r]^sum[l])^s); else sum[xx]=(sum[r]^sum[l]); ans++; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 1733 Parity game(并查集)
- poj 1733 Parity game(带权并查集)
- POJ 1733 Parity game(离散化 + 带权并查集)
- poj 1733 Parity game 【离散+并查集】
- POJ 1733 Parity game 带权并查集
- POJ 1733 Parity game 带权并查集+离散化处理
- poj 1733 Parity game(带权并查集+离散化)
- poj 1733 Parity game 【种类并查集+离散化】
- POJ 1733 Parity game 【带权并查集】
- [POJ 1733]Parity game[并查集]
- POJ 1733 Parity game (并查集)
- poj 1733_Parity game_并查集
- poj 1733 Parity game 并查集 离散化
- poj 1733 Parity game 并查集 解题报告
- POJ-1733-Parity game [带权并查集][离散化]
- POJ - 1733 Parity game (带权并查集)
- POJ 1733 Parity game 离散化+带权并查集
- poj-1733 Parity game 并查集
- POJ 1733 Parity game(并查集)
- POJ 1733 Parity game(并查集巧解)