题目链接: https://www.nowcoder.com/acm/contest/119/A
题意 给你一个长度为N的数组 给你M行询问 [L,R]的亦或值是否与K冲突,冲突的话输出冲突的询问,不冲突不用管 ,若没有冲突输出 -1
参考:https://www.cnblogs.com/nowheretrix/p/9004557.html
并查集,没想到还可以这样用
建立一个带权并查集
Val[x] 为权值 代表x到树根的亦或值
1 . 如果 L-1与R在一个树上 那么 Val[L-1]^Val[R] 就是 [L,R]的亦或值,直接与K比较就行
2 . 如果不在一个树上 那么 肯定符合(题目中有),然后把两个树连起来 你会发现 两个间根的亦或值为Val[L-1]^Val[R]^k 这样更新下权值
代码
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
#define ll long long
#define inf 0x3f3f3f3f
int ss[100003];
int val[100003];
int find(int x){if(x==ss[x]) return ss[x];int t=ss[x];ss[x]=find(ss[x]);val[x]=val[x]^val[t];return ss[x];}
int main(){int n,m;cin>>n>>m;int flag=0;for(int i=0;i<=n;i++) ss[i]=i;for(int i=1;i<=m;i++){int l,r,k;cin>>l>>r>>k;l--;int xx=find(l);int yy=find(r);if(xx!=yy){ss[xx]=yy;val[xx]=val[l]^val[r]^k;}else{int x=val[r]^val[l];if(x!=k){cout<<i<<endl;flag=1;}}}if(!flag) cout<<"-1"<<endl;return 0;
}
完全没想到并查集,还一直以为….