并查集+离散化一下就行了,dsu随便写的,没按秩合并什么的,跑的1.6s,常数可能有点,离散化写的也有点丑陋了
struct DSU{
int n;
vector<int> f;
void init(int _){
n=_;
f.resize(n+1);
for(int i=1;i<=n;i++){
f[i]=i;
}
}
int find(int x){
if(x==f[x])return x;
else{
return f[x]=find(f[x]);
}
}
void merge(int x,int y){
x=find(x);
y=find(y);
if(x==y)return ;
f[x]=y;
return ;
}
bool same(int x,int y){
return find(x)==find(y);
}
};
int p(int x,vector<int> &v){
int L=0,R=v.size(),pos=-1;
while(L<=R){
int mid=(L+R)>>1;
if(v[mid]<=x){
pos=mid;
L=mid+1;
}else{
R=mid-1;
}
}return pos;
}
void solve(){
int n;
cin>>n;
vector<pair<int,int>>q,r;
vector<int> k;
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
if(c!=1){
q.push_back({a,b});
}else{
r.push_back({a,b});
}
k.push_back(a);
k.push_back(b);
}
sort(k.begin(),k.end());
k.erase(unique(k.begin(),k.end()),k.end());
unordered_map<int,int>f;
DSU d;
d.init(k.size()+1);
for(int i=0;i<r.size();i++){
int u,v;
if(f.find(r[i].first)==f.end()){
f[r[i].first]=p(r[i].first,k);
}
u=f[r[i].first];
if(f.find(r[i].second)==f.end()){
f[r[i].second]=p(r[i].second,k);
}
v=f[r[i].second];
d.merge(u,v);
}
for(int i=0;i<q.size();i++){
int u,v;
if(f.find(q[i].first)==f.end()){
f[q[i].first]=p(q[i].first,k);
}
u=f[q[i].first];
if(f.find(q[i].second)==f.end()){
f[q[i].second]=p(q[i].second,k);
}
v=f[q[i].second];
if(d.same(u,v)){
cout<<"NO"<<'\n';
return ;
}
}cout<<"YES"<<'\n';
}

京公网安备 11010502036488号