食物链一开始做的时候不是很理解,然后后来想想想明白了,然后比赛靠着理解写出来但是忘记写xy可以小于1导致一直没a掉...很遗憾....
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
typedef long long ll;
using namespace std;
int re[50005];
int pre[50005];
int find(int x){
int t;
if(pre[x]!=x) {
t=find(pre[x]);
re[x]+=re[pre[x]];
pre[x]=t;
}
return pre[x];
}
int main(){
int n,k,sum=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++) pre[i]=i;
while(k--){
int d;
int x,y,a,b;
scanf("%d %d %d",&d,&x,&y);
if(x>n||y>n||x<1||y<1) sum++;
else if(d==1){
a=find(x);b=find(y);
if(a==b&&abs(re[x]-re[y])%3!=0) sum++;
else if(a!=b){
pre[a]=b;
re[a]=re[y]-re[x];
}
}
else {
a=find(x);b=find(y);
if(a==b&&abs(re[x]-re[y]-1)%3!=0) sum++;
else if(a!=b){
pre[a]=b;
re[a]=re[y]-re[x]+1;
}
}
}
cout<<sum<<endl;
}