牛客-Beauty of Trees

題目鏈接: 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;
}

完全沒想到並查集,還一直以爲….

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章