2 条题解

  • 0
    @ 2025-10-8 17:02:02

    by hansang:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int fa[N], ft[N], sum[N];
    int findfa(int x){
        if(fa[x]==x) return fa[x];
        int f=fa[x];
        int tx=findfa(fa[x]);
        ft[x]+=ft[f];
        sum[x]=sum[f];
        return fa[x]=tx;
    }
    int main(){
        int n; scanf("%d", &n);
        for(int i=1; i<=n; i++) fa[i]=i, ft[i]=0, sum[i]=1;
        for(int i=1; i<=n; i++){
            char s[5]; scanf("%s", s);
            if(s[0]=='M'){
                int x, y; scanf("%d%d", &x, &y);
                int tx=findfa(x), ty=findfa(y);
                fa[ty]=tx; ft[ty]=sum[tx];
                sum[tx]+=sum[ty]; 
            }
            else{
                int x; scanf("%d", &x);
                int tx=findfa(x);
                printf("%d\n", sum[x]-ft[x]-1);
            }
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:01:50

      by hansang:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+10;
      int fa[N], ft[N], sum[N];
      int findfa(int x){
      	if(fa[x]==x) return fa[x];
      	int f=fa[x];
      	int tx=findfa(fa[x]);
      	ft[x]+=ft[f];
      	sum[x]=sum[f];
      	return fa[x]=tx;
      }
      int main(){
      	int n; scanf("%d", &n);
      	for(int i=1; i<=n; i++) fa[i]=i, ft[i]=0, sum[i]=1;
      	for(int i=1; i<=n; i++){
      		char s[5]; scanf("%s", s);
      		if(s[0]=='M'){
      			int x, y; scanf("%d%d", &x, &y);
      			int tx=findfa(x), ty=findfa(y);
      			fa[ty]=tx; ft[ty]=sum[tx];
      			sum[tx]+=sum[ty]; 
      		}
      		else{
      			int x; scanf("%d", &x);
      			int tx=findfa(x);
      			printf("%d\n", sum[x]-ft[x]-1);
      		}
      	}
      	return 0;
      } 
      • 1

      USACO(49.1)并查集2:叠积木[Cube Stacking&#44; 2004 Open]

      信息

      ID
      2646
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      10
      已通过
      4
      上传者