蒟蒻80分求助
查看原帖
蒟蒻80分求助
540177
wyf_sinon楼主2023/4/17 18:14

蒟蒻的代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long t,n;
long long alls[N*2],fa[N*2],cnt;
struct str{
	long long i,j,e;
}s[N];
void read(long long &x){ 
	int f=1;x=0;char s=getchar();
	while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
	while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
	x*=f;
}
long long find(long long x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
bool cmp(str a,str b){
	return a.e>b.e;
}
int main() {
	read(t);
	while(t--){
		bool flag=true;
		read(n);
		cnt=0;
		for(int k=0;k<2*n;k++) fa[k]=k;
		for(int k=0;k<n;k++){
			read(s[k].i);read(s[k].j);read(s[k].e);
			alls[cnt++]=s[k].i;alls[cnt++]=s[k].j;
		}
		sort(alls,alls+cnt);
		int sz=unique(alls,alls+cnt)-alls;
		sort(s,s+n,cmp);
		for(int k=0;k<n;k++){
			long long t=lower_bound(alls,alls+sz,s[k].i)-alls;
			long long x=lower_bound(alls,alls+sz,s[k].j)-alls;
			long long a=find(t),b=find(x),c=find(t+n),d=find(x+n);
			if(s[k].e){
				if(a==b) continue;
				fa[a]=find(b);
			}else{
				if(a==b){
					cout<<"NO"<<endl;flag=false;break;
				}else{
					if(a==d||b==c){
						continue;
					}
					fa[d]=a;
					fa[c]=b;
				}
			}
		}
		if(flag) cout<<"YES"<<endl;
	}
	return 0;
}
2023/4/17 18:14
加载中...