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
 - 上传者