1 条题解

  • 0
    @ 2025-6-12 21:31:15
    #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
    上传者