题意:
t组数据,每组n个给出两个变量是相等还是不等的约束条件,要求判断是否能满足。n≤1000000,变量数量≤109
题解:
先离散化,然后只处理相等条件用并查集维护“相等集合”,接着对每个不相等条件判断是否在一个集合,是的话则说明不满足。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define maxn 1000100 6 #define inc(i,j,k) for(int i=j;i<=k;i++) 7 using namespace std; 8 9 inline int read(){ 10 char ch=getchar(); int f=1,x=0; 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 12 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 13 return f*x; 14 } 15 int t,n; 16 struct opt{int a,b; bool c;}; opt opts[maxn]; 17 struct ls{int a,c; bool b;}; ls lss[maxn*2]; int lsss,tot,fa[maxn*2]; 18 bool cmp(ls a,ls b){return a.a<b.a;} 19 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} 20 int main(){ 21 t=read(); while(t--){ 22 n=read(); lsss=0; 23 inc(i,1,n){ 24 int a=read(),b=read(); opts[i].c=read(); 25 lss[++lsss]=(ls){a,i,0}; lss[++lsss]=(ls){b,i,1}; 26 } 27 sort(lss+1,lss+lsss+1,cmp); tot=0; 28 inc(i,1,lsss){ 29 if(i==1||lss[i].a!=lss[i-1].a)tot++; 30 if(!lss[i].b)opts[lss[i].c].a=tot;else opts[lss[i].c].b=tot; 31 } 32 inc(i,1,tot)fa[i]=i; 33 inc(i,1,n)if(opts[i].c){ 34 int x=find(opts[i].a),y=find(opts[i].b); if(x!=y)fa[x]=y; 35 } 36 bool f=0; 37 inc(i,1,n)if(!opts[i].c){ 38 int x=find(opts[i].a),y=find(opts[i].b); if(x==y){f=1; break;} 39 } 40 if(f)puts("NO");else puts("YES"); 41 } 42 return 0; 43 }
20160608