题面:https://www.luogu.org/problemnew/show/P2024
本题是带权并查集模板题,要注意的是种类一共有三种,之后套公式判断是否合法,记录不合法即可。
Code:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=50005;
int f[N],p[N],n,k,ans;
int find(int x){
if(x!=f[x]){
int fa=f[x];
f[x]=find(f[x]);
p[x]=(p[x]+p[fa])%3;
}
return f[x];
}
bool unionn(int d,int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy){
if((p[y]-p[x]+3)%3!=d){
return 1;
}
else{
return 0;
}
}
f[fy]=fx;
p[fy]=(p[x]-p[y]+d+3)%3;
return 0;
}
int main(){
int d,x,y;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
f[i]=i;
p[i]=0;
}
for(int i=1;i<=k;i++){
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(x==y&&d==2)){
ans++;
continue;
}
if(unionn(d-1,x,y)){
ans++;
}
}
printf("%d\n",ans);
return 0;
}