題目鏈接: 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;
}
完全沒想到並查集,還一直以爲….