有10^9个点,每次给出两个点的关系:权相等或不等,问最后能不能成立
感觉一开始在撕烤一个动态的问题,,,想写一个带权的并查集
结果发现静态询问,那就sb乱搞,懒得手写离散就直接map(卧槽好多细节忘考虑)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int T,n,N,Nm,x,y,e; 4 map<int,int> o; 5 int fa[500001],X[500001],Y[500001]; 6 int getfa(int x) 7 { 8 if(fa[x]==x) return x; 9 else return fa[x]=getfa(fa[x]); 10 } 11 int main() 12 { 13 for(scanf("%d",&T);T;T--) 14 { 15 scanf("%d",&n);Nm=0;N=0;o.clear(); 16 for(int i=1;i<=2*n;i++) 17 fa[i]=i; 18 bool over=0; 19 for(int i=1;i<=n;i++) 20 { 21 scanf("%d%d%d",&x,&y,&e); 22 if(over) continue; 23 if(x==y) 24 { 25 if(e==0) 26 { 27 over=1; 28 puts("NO"); 29 } 30 else 31 continue; 32 } 33 int Xx=o[x],Yx=o[y]; 34 if(!Xx)o[x]=++Nm,x=Nm;else x=Xx; 35 if(!Yx)o[y]=++Nm,y=Nm;else y=Yx; 36 if(e) 37 fa[getfa(x)]=getfa(y); 38 else 39 X[++N]=x,Y[N]=y; 40 } 41 if(over) continue; 42 bool flag=0; 43 for(int i=1;i<=N;i++) 44 if(getfa(X[i])==getfa(Y[i])) 45 flag=1; 46 puts(flag?"NO":"YES"); 47 } 48 return 0; 49 }