很~简~damn~
2026-05-25 22:32:59
发布于:江苏
1阅读
0回复
0点赞
(虽然不知道为什么提交后显示最早二五年八月三号通过,而且我从来没做过,并且码风诡异,但反正我的代码是自己的就行)
其他的不难,只有两个坑点:
一:最大i和j能到1e9,所以要离散化一下(不会有人像我一样没发现傻傻的交了半天1e5的结果全部re吧......)
二:一定要记住先记录,后处理(详细理解题目可知),先保存好‘=’类的数再处理不等qwp
其他的直接并查集即可(还有我的同学没有提交记录是怎么过的???)
#include<iostream>
#include<unordered_map>
#include<queue>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,father[N],cnt;
unordered_map<int,int> mp;
int find(int x){
if(father[x]==x){
return x;
}
return father[x]=find(father[x]);
}
void join(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
father[fy]=fx;
}
}
signed main(){
cin>>t;
while(t--){
queue<pair<int,int>> q;
mp.clear();
cnt=0;
cin>>n;
for(int i=1;i<=2*n;i++){
father[i]=i;
}
for(int i=1;i<=n;i++){
int x,y,opt;
cin>>x>>y>>opt;
auto itx=mp.find(x);
auto ity=mp.find(y);
if(itx==mp.end()){
mp.insert(make_pair(x,++cnt));
}
if(ity==mp.end()){
mp.insert(make_pair(y,++cnt));
}
x=mp[x];
y=mp[y];
if(opt){
join(x,y);
}
else{
q.push({x,y});
}
}
bool flat=0;
while(!q.empty()){
int x=q.front().first,y=q.front().second;
q.pop();
int fx=find(x),fy=find(y);
if(fx==fy){
cout<<"NO"<<endl;
flat=1;
break;
}
}
if(!flat){
cout<<"YES"<<endl;
}
}
}
卡了很久后发现要离散化的我:
这里空空如也






有帮助,赞一个