牛客-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;
}

完全没想到并查集,还一直以为….

猜你喜欢

转载自blog.csdn.net/qq_37493070/article/details/80239344