第一次wa是因为负数的问题
现在虽然ac了 不过还是有一点小问题
赶着睡觉
晚上再处理
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=50001;
struct
{
int fa,re;
}f[maxn];
int ans;
int findre(int x)
{
if(f[x].fa!=x)
return((f[x].re+findre(f[x].fa)+3)%3);
return((f[x].re+3)%3);
}
int find(int x)
{
if(f[x].fa!=x)
{
f[x].re+=findre(f[x].fa);
f[x].re%=3;
f[x].fa=find(f[x].fa);
}
return(f[x].fa);
}
int main()
{
// freopen("in.txt","r",stdin);
int n,k;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
f[i].fa=i;
f[i].re=0;
}
ans=0;
for(int i=1,a,b,c;i<=k;i++)
{
scanf("%d %d %d",&c,&a,&b);
if(a>n||b>n)
{
ans++;
continue;
}
else if(c==1)
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
{
f[f2].re=findre(a)-findre(b);
f[f2].fa=f1;
}
else
{
int r1=findre(a);
int r2=findre(b);
if(r1%3!=r2)
ans++;
}
}
else
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
{
f[f2].re=findre(a)+1-findre(b);
// if(f[f2].re<0)
// f[f2].re+=-(f[f2].re/3*3)+9;
f[f2].fa=f1;
}
else
{
int r1=findre(a);
int r2=findre(b);
if((r1+1)%3!=r2)
ans++;
}
}
}
// for(int i=1;i<=n;i++)
// printf("%d %d\n",find(i),findre(i));
printf("%d\n",ans);
return 0;
}