1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2*1e6; int n,m; int inf = 1e5; int ans[N],sum[N],f[N]; int find(int p) { if(f[p]!=p) f[p] = find(f[p]); return f[p]; } void merge(int a,int b) { if(find(a)!=find(b)) { sum[find(a)] += sum[find(b)]; ans[find(a)] ^= ans[find(b)]; f[find(b)] = find(a); } return; } void add(int v,int w) { if(find(w)!=find(v)) { sum[find(w)] ++; sum[find(v)] --; ans[find(w)] ^= v; ans[find(v)] ^= v; f[v] = find(w); } return; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int t; cin>>t; while(t--) { cin>>n>>m; for(int i = 1;i<=n;i++) { f[i] = i+inf; f[i+inf] = i+inf; ans[i+inf] = i; sum[i+inf] = 1; } while(m--) { int op; cin>>op; if(op==1) { int a,b; cin>>a>>b; merge(a,b); } else if(op==2) { int v,w; cin>>v>>w; add(v,w); } else { int x; cin>>x; //cout<<find(x)<<endl; cout<<sum[find(x)]<<" "<<ans[find(x)]<<endl; } // for(int i = 1;i<=n;i++) // cout<<find(i)<<" "; // cout<<endl; // } } return 0; }
并查集,祖宗节点是不可动节点(大祖宗不可动)
信息
- ID
- 1093
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 2
- 上传者