并查集 + 离散化

思路

离散化之后,先执行 op = 1 的,再执行 op = 0 的
执行 op = 1 的时:直接合并
执行 op = 0 的时:进行判断

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 1e7+10;

struct node{
    int x,y;
    int op;    
    bool operator < (const node & a) const{
        return op > a.op  ;
    }    
}p[N];
vector<int> V; 
int fa[N];
int n;

int find(int x){
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}

int main(){
    int T;  cin>>T;
    while(T--){
        cin>>n;    
        for(int i=0;i<n;i++) {
            int x,y,op;
            cin>>x>>y>>op;
            p[i]={x,y,op};
            V.push_back(x); 
            V.push_back(y);
        }
        sort(p,p+n);
        sort(V.begin(),V.end());
        V.erase(unique(V.begin(),V.end()),V.end());

        for(int i=0;i<n;i++){
            p[i].x=lower_bound(V.begin(),V.end(),p[i].x)-V.begin()+1;
            p[i].y=lower_bound(V.begin(),V.end(),p[i].y)-V.begin()+1;
        }
        for(int i=1;i<=V.size();i++) fa[i]=i;

        bool flag=false;
        for(int i=0;i<n;i++){
            int x=p[i].x,y=p[i].y,op=p[i].op;
            if(op==1) {
                x=find(x),y=find(y);
                if(x!=y) fa[x]=y;
            }
            else{
                x=find(x),y=find(y);
                if(x==y) {    flag=true;    break;    }
            }
        }
        if(flag) puts("NO");
        else puts("YES");
        V.clear();
    }

    return 0;
}