P1196 [NOI2002]銀河英雄傳說 並查集

並查集好題,維護兩個值,一個是所處隊列大小,一個是每個結點隊列前面還有幾個數。

第二個維護需要巧妙的搞一搞,見find函數

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;++i)
#define for1(i,n) for(int i=1;i<=n;++i)
#define IO ios::sync_with_stdio(false);cin.tie(0)
const int maxn = 3e4+5;

int par[maxn],sz[maxn],front[maxn];

void init(){
    forn(i,maxn) par[i] = i,sz[i] = 1,front[i] = 0; 
}
int find(int x){
    if(par[x] == x) return x;
    int fx = find(par[x]);
    front[x] += front[par[x]];
    return par[x] = fx;
}
int main(){ 
    IO;init();
    int t;cin>>t;while(t--){
        char op;int x,y;cin>>op>>x>>y;
        int fx = find(x),fy = find(y);
        if(op=='M'){
            front[fx] += sz[fy];
            sz[fy] += sz[fx];
            par[fx] = fy;
        }else{
            if(fx!=fy) cout<<-1<<'\n';
            else cout<<abs(front[x]-front[y])-1<<'\n';
        }   
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章