社区讨论
求救
P2024[NOI2001] 食物链参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo88f5gy
- 此快照首次捕获于
- 2023/10/27 14:28 2 年前
- 此快照最后确认于
- 2023/10/27 14:28 2 年前
一开始样例过了只能对俩点,现在样例都过不了了
CPP#include<bits/stdc++.h>
using namespace std;
int fa[50005],d[50005];
int m,n;
int get(int x){
if(x==fa[x]){
return x;
}
int a=get(fa[x]);
d[x]+=d[fa[x]];
d[x]%=3;
fa[x]=a;
return a;
}
void merge(int x,int y,int n){
int a=get(x),b=get(y);
d[a]+=(d[y]-d[x]+3+n)%3;
fa[a]=b;
}
int main(){
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
d[i]=0;
}
for(int i=1;i<=m;i++){
int q,x,y;
scanf("%d%d%d",&q,&x,&y);
if(x<0||x>n||y<0||y>n||(q==2&&x==y)){
ans++;
continue;
}
if(q==1){
if(get(x)==get(y)&&d[x]%3!=d[y]%3){
ans++;
continue;
}
else if(get(x)!=get(y)){
merge(x,y,0);
}
}
else{
if(get(x)==get(y)&&(d[x]%3!=(d[y]+2)%3)){
ans++;
//cout<<"b";
continue;
}
else if(get(x)!=get(y)){
merge(x,y,1);
}
//merge(x,y,1);
//cout<<"a";
}
}
//for(int i=1;i<=n;i++){
// cout<<i<<' '<<d[i]<<endl;
//}
cout<<ans<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...