https://www.lydsy.com/JudgeOnline/problem.php?id=4195
离散化 用数组进行处理,比map稍微快一丢丢。。。
#include<bits/stdc++.h>
using namespace std;
const int M = 1000000+100;
int fa[M];
int sa[M],sb[M];
int a[M*2],b[M];
int ta[M],tb[M];
int e[M];
int get(int x)
{
if(fa[x]==x)
return x;
return fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
fa[get(x)]=get(y);
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=1;i<=1000000;i++)fa[i]=i;
int z,x,y,n;
cin>>n;
for(int i =1; i <=n;i++)
{
scanf("%d %d %d",&sa[i],&sb[i],&z);
a[i]=sa[i],a[i+n]=sb[i],e[i]=z;
}
sort(a+1,a+1+n+n);
// int numa=unique(a+1,a+1+n+n)-(a+1);
for(int i=1;i<=n;i++)
{
ta[i]=lower_bound(a+1,a+1+n+n,sa[i])-a;
tb[i]=lower_bound(a+1,a+1+n+n,sb[i])-a;
}
for(int i =1; i <=n;i++)
{
if(e[i])
merge(ta[i],tb[i]);
}
bool f=true;
for(int i =1;i<=n;i++)
{
if(!e[i])
{
if(get(ta[i])==get(tb[i]))
f=false;
}
}
if(f)
puts("YES");
else
puts("NO");
}
return 0;
}
用map进行离散,这样没有排序,但这一题不需要排序,只要判断就行
int a=to[x];if(a==0){a=++n;to[x]=fa[a]=a;}
int b=to[y];if(b==0){b=++n;to[y]=fa[b]=b;}
if(z)
merge(to[x],to[y]);
else
s[++num]=a,t[num]=b;