2 条题解

  • 1
    @ 2026-9-16 17:36:22
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<algorithm>
    #include<vector>
    #define int long long
    using namespace std;
    const int N=1e6+5;
    const int INF=0x3f3f3f3f;
    int dep[N],fa[N],dis[N];//dep[i]此条队伍的人数    fa[i]这个人的祖宗/也是这个人所在的队伍   dis[i]这个人在他所在的队列里的位置(第几名)
    void init(){
    	for(int i=1;i<=30000;i++){
    		fa[i]=i;
    		dep[i]=1,dis[i]=0;
    	}
    }
    int find(int x){
    	if(fa[x]==x)return x;
    	int xx=find(fa[x]);
    	dis[x]+=dis[fa[x]];
    	return fa[x]=xx;
    }
    void add(int x,int y){
    	int fx=find(x);
    	int fy=find(y);
    	dis[fx]+=dep[fy];
    	fa[fx]=fy;
    	dep[fy]+=dep[fx];
    	dep[fx]=0;
    	
    }
    int sum(int x,int y){
    	int fx=find(x);
    	int fy=find(y);
    	if(fx!=fy){
    		return -1;
    	}
    	return abs(dis[x]-dis[y])-1;
    }
    signed main(){
    	int n;
    	scanf("%lld",&n);
    	init();
    	for(int i=1;i<=n;i++){
    		char opt;
    		int x,y;
    		cin >> opt;
    		scanf("%lld%lld",&x,&y);
    		if(opt=='M'){
    			add(x,y);
    		}else if(opt=='C'){
    			cout << sum(x,y) << endl;
    		}
    	}
    	return 0;
    }
    
    
    
    
    • -1
      @ 2022-9-25 16:52:30
      #include<iostream>
      #include<cstdio>
      #include<cstring>
      #include<string>
      #include<cmath>
      #include<queue>
      #include<stack>
      #include<algorithm>
      #include<vector>
      #define int long long
      using namespace std;
      const int N=1e6+5;
      const int INF=0x3f3f3f3f;
      int dep[N],fa[N],dis[N];//dep[i]此条队伍的人数    fa[i]这个人的祖宗/也是这个人所在的队伍   dis[i]这个人在他所在的队列里的位置(第几名)
      void init(){
      	for(int i=1;i<=30000;i++){
      		fa[i]=i;
      		dep[i]=1,dis[i]=0;
      	}
      }
      int find(int x){
      	if(fa[x]==x)return x;
      	int xx=find(fa[x]);
      	dis[x]+=dis[fa[x]];
      	return fa[x]=xx;
      }
      void add(int x,int y){
      	int fx=find(x);
      	int fy=find(y);
      	dis[fx]+=dep[fy];
      	fa[fx]=fy;
      	dep[fy]+=dep[fx];
      	dep[fx]=0;
      	
      }
      int sum(int x,int y){
      	int fx=find(x);
      	int fy=find(y);
      	if(fx!=fy){
      		return -1;
      	}
      	return abs(dis[x]-dis[y])-1;
      }
      signed main(){
      	int n;
      	scanf("%lld",&n);
      	init();
      	for(int i=1;i<=n;i++){
      		char opt;
      		int x,y;
      		cin >> opt;
      		scanf("%lld%lld",&x,&y);
      		if(opt=='M'){
      			add(x,y);
      		}else if(opt=='C'){
      			cout << sum(x,y) << endl;
      		}
      	}
      	return 0;
      }
      
      
    • 1

    信息

    ID
    149
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    48
    已通过
    19
    上传者