11分求调TAT
查看原帖
11分求调TAT
1020332
cancan1030楼主2025/7/24 21:55
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
long long line[N],col[N],len[N],tag[N],pre=0;
void init(){
    for(long long i=0;i<=N;i++){
        line[i]=i;
        col[i]=1;
        len[i]=1;
        tag[i]=0;
    }
}
long long check(long long x){
    if(line[x]==x){
    	pre=x;
        return x;
    }
    line[x]=check(line[x]);
    tag[x]+=tag[pre];
    col[x]+=tag[pre];
    pre=x;
    return line[x];

}
void merge(long long a,long long b){
	long long fa=check(a),fb=check(b);
    line[fa]=fb;
    tag[fa]+=len[fb];
    len[fb]+=len[fa];
}
int main(){
    long long n;
    cin>>n;
    init();
    
    for(long long k=1;k<=n;k++){
        char c;
        long long i,j;
        cin>>c>>i>>j;
        if(c=='M'){
            merge(i,j);
        }
        else{
            if(check(i)==check(j)){
            	cout<<abs(col[i]-col[j])-1;
			}
			else{
				cout<<-1;
			}
        }
    }
    return 0;
}
2025/7/24 21:55
加载中...