社区讨论
求助带权并查集
P2024[NOI2001] 食物链参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @louxy701
- 此快照首次捕获于
- 2023/11/12 11:53 2 年前
- 此快照最后确认于
- 2023/11/12 14:10 2 年前
rt,经典30pts.
w[u] 为 u 节点相对于其父亲的关系,0 同类,1 被吃,2 吃。
CPP#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
const int mod=3;
int fa[maxn],w[maxn];
int Find(int u) {
if(fa[u]) {
fa[u]=Find(fa[u]);
w[u]=(w[fa[u]]+w[u]+mod)%mod;
return fa[u];
}
return u;
}
void Merge(int u,int v,int c) {
int fu=Find(u),fv=Find(v);
fa[fu]=fv;
w[u]=c;
}
int main() {
int n,T,cnt=0;
cin>>n>>T;
while(T--) {
int op,u,v,f=1;
cin>>op>>u>>v;
if(u>n||v>n||(op==2&&u==v)) {
cnt++;
f=0;
continue;
}else
if(op==1) {
if(Find(u)==Find(v)&&w[u]!=w[v]) {
cnt++;
f=0;
}else if(Find(u)!=Find(v)) {
Merge(Find(v),Find(u),(w[u]-w[v]+mod)%mod);
}
}else {
if(Find(u)==Find(v)) {
if(w[u]!=(w[v]-1+mod)%mod) {
cnt++;
f=0;
}
}else {
Merge(Find(v),Find(u),(w[u]-w[v]+1+mod)%mod);
}
}
// cout<<(f?"T\n":"F\n");
}
cout<<cnt;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...