[BZOJ3376][Usaco2004 Open]Cube Stacking 方块游戏:并查集

分析:

会有人用LCT吗(划掉)?
fa,bot,dis分别维护一个点最上面的点,最底下的点,到最上面的距离。
注意要时刻维护并查集内维护的信息的正确性。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>

inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x;
}

const int MAXN=30005;
int n=30000,p,fa[MAXN],bot[MAXN],dis[MAXN];

int getf(int x){
    if(fa[x]==x) return x;
    int y=fa[x];
    fa[x]=getf(fa[x]);
    dis[x]=dis[x]+dis[y];
    bot[x]=bot[y];
    return fa[x];
}

int main(){
    p=read();
    for(int i=1;i<=n;i++){
        fa[i]=i;
        bot[i]=i;
        dis[i]=0;
    }
    while(p--){
        char ch=getchar();
        while(!isalpha(ch)) ch=getchar();
        if(ch=='M'){
            int x=read(),y=read();
            int xx=getf(x),yy=getf(y);
            fa[yy]=xx;
            dis[yy]=dis[bot[xx]]+1;
            bot[xx]=bot[yy];
            getf(bot[x]);getf(bot[y]);
        }
        else{
            int x=read();
            getf(x);
            getf(bot[x]);
            printf("%d\n",dis[bot[x]]-dis[x]);
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/9715905.html