题:https://www.luogu.org/problem/P2024
解析:https://blog.csdn.net/m0_37579232/article/details/79920785
#includeusing namespace std;#define lson root<<1,l,midd#define rson root<<1|1,midd+1,rtypedef long long ll;const int M=5e4+4;int f[M],sta[M];//sta[i]==0表i与父亲同级, sta[i]==1表i被父亲吃,sta[i]==2表i吃父亲 int find(int x){ if(f[x]==x) return x; int y=f[x]; f[x]=find(f[x]); sta[x]=(sta[x]+sta[y])%3; return f[x];}bool check(int x,int y,int sign){ int a=find(x),b=find(y); if(a==b){ if(sign!=(sta[y]-sta[x]+3)%3)//+3防出现负数 ,可看作向量 return false; return true; } f[b]=a; sta[b]=(sta[x]-sta[y]+sign+3)%3; return true;}int main(){ int t; cin>>t; while(t--){ int n,m,countt=0; cin>>n>>m; for(int i=0;i<=n;i++) f[i]=i,sta[i]=0; while(m--){ int op,x,y; cin>>op>>x>>y; if(op==2&&(x==y)||x>n||y>n){ countt++; continue; } if(!check(x,y,op-1)) countt++; } cout< <