1 条题解
-
1
首先,这题在洛谷已经降绿了。
这题可以这么想:有一些状态,如果有操作就是查询或者将两个状态合并。
具体见代码。
#include<bits/stdc++.h> using namespace std; int fa[150005]; int getfa(int x){ if(fa[x]==x) return x; return fa[x]=getfa(fa[x]); } void merrrrrr(int x,int y){//merrrrrr!!!!!! if(getfa(x)==getfa(y)) return ; fa[getfa(x)]=getfa(y); return ; } int main(){ int n,k,ans=0; cin>>n>>k; for(int i=1;i<=3*n;i++){ fa[i]=i; } while(k--){ int op; cin>>op; if(op==1){ int x,y; cin>>x>>y; if(x>n||y>n){ ans++; continue; } if(getfa(x+n)==getfa(y)||getfa(y+n)==getfa(x)){ ans++; } else{ merrrrrr(x,y); merrrrrr(x+n,y+n); merrrrrr(x+2*n,y+2*n); } } else{ int x,y; cin>>x>>y; if(x>n||y>n){ ans++; continue; } if(getfa(x)==getfa(y)||getfa(x)==getfa(y+n)){ ans++; } else{ merrrrrr(x+n,y); merrrrrr(x+2*n,y+n); merrrrrr(x,y+2*n); } } } cout<<ans; return 0; }还有,注意合并时候的细节问题以及能否合并。
这题难度不高,但是如果是初学并查集的,建议先做这几题。
信息
- ID
- 456
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 58
- 已通过
- 22
- 上传者