80分求条 玄关
查看原帖
80分求条 玄关
1258210
pipilong2024楼主2025/2/4 15:08

RE on #2
WA on #3

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define error {flag=0;break;}
const string ans[]={"NO\n","YES\n"};
//这三行都是个人习惯,为了减少码量

const int maxn=2e5+10;
int T,n,cnt,fa[maxn];

unordered_set<int>st;
unordered_map<int,int>mp;
//离散化

struct Node{
	int opt,x,y;
}a[maxn/2];//存储每次操作信息

int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}//并查集

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		st.clear(),mp.clear(),cnt=0;//多测清空
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].y>>a[i].opt;
			st.insert(a[i].x),st.insert(a[i].y);//去重
		}
		for(auto j:st) mp[j]=st.size()-(++cnt)+1;//离散化编号
		for(int i=1;i<=cnt*2;i++) fa[i]=i;//并查集初始化
		bool flag=1;//用于判断所有条件是否可以同时满足
		for(int i=1;i<=n;i++){
			int opt=a[i].opt,x=mp[a[i].x],y=mp[a[i].y];
			int rx=find(x),ry=find(y),rxn=find(x+cnt),ryn=find(y+cnt);//种类并查集
			if(opt){
				if(rxn==ry||rx==ryn) error;
				fa[rx]=ry,fa[rxn]=ryn;
			}else{
				if(rx==ry||rxn==ryn) error;
				fa[rxn]=ry,fa[rx]=ryn;
			}
		}
		cout<<ans[flag];
	}
	return 0;
}
2025/2/4 15:08
加载中...