牛客网 第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees(扩展并查集)
题意:给你m段区间,每次告诉你区间的异或和,然后问你,那些输入是冲突的,并打印那一条错了 题目传送门
思路:和HDU3038一样,只是把减的调教改为异或的条件就可以了
代码:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long LL; inline LL read() { LL x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=200010; int fa[maxn]; int sum[maxn]; int Find(int x) { if(x!=fa[x]){ int t=fa[x]; fa[x]=Find(fa[x]); sum[x]^=sum[t]; } return fa[x]; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ for(int i=0;i<=n;i++){ fa[i]=i; sum[i]=0; } int ans=0; bool ok=false; for(int i=1;i<=m;i++){ int a=read(),b=read(),w=read(); a--; int rta=Find(a); int rtb=Find(b); if(rta==rtb){ if(sum[a]!=(sum[b]^w)){ printf("%d\n",i); ok=true; } } else{ fa[rta]=rtb; sum[rta]=sum[a]^sum[b]^w; } } if(!ok)puts("-1"); } return 0; }