POJ1988 Cube Stacking 題解

POJ1988 Cube Stacking 題解

原題鏈接:http://poj.org/problem?id=1988

題目大意

N 個方塊,P 個操作。一種操作是M x y 表示把含x 的方塊堆移動到含y 的方塊堆頂部,另一種操作C x 詢問在含x 方塊的方塊堆中,在x 方塊下面的方塊數,然後輸出。

解題思路

並查集的路徑迭代。
定義Up[i]i 方塊上的方塊數(含自己),Down[i]i 方塊下的方塊數(不含自己),顯然初始化Up[i]=1,Down[i]=0
M x y
對於每次M 操作,我們可以發現含x 的方塊堆下多了含y 的方塊堆的方塊數,即Down[x]+=Up[y] ,含y 的方塊堆上多了含x 的方塊堆的方塊數,即Up[y]+=Down[x] ,但是兩個方塊堆中其他方塊沒有被修正,這裏就要把getfa(x) 這個函數做修改,每次getfa(x) 的時候Down[x]+=Down[fa[x]] 即可。
對於C 操作,輸出Down[x] 就行了。

代碼

#include<cstdio>
#include<algorithm>
using namespace std;
int N,Up[30005],Down[30005],fa[30005];
inline int getfa(int x){
    if (x==fa[x]) return x;
    int f=fa[x];
    fa[x]=getfa(fa[x]); //這裏先修正Down[fa[x]]
    Down[x]+=Down[f]; //修正Down[x]
    return fa[x];
}
inline void merge(int x,int y){
    x=getfa(x);y=getfa(y);
    if (x==y) return ;
    Down[x]=Up[y];Up[y]+=Up[x];fa[x]=y;
}
inline char read(){
    char ch=getchar();
    while (ch!='M'&&ch!='C') ch=getchar();
    return ch;
}
int main()
{
    scanf("%d",&N);
    for (int i=1;i<=30000;i++) fa[i]=i,Up[i]=1,Down[i]=0; //初始化
    for (int i=1;i<=N;i++){
        char ch=read();
        if (ch=='M'){
            int x,y;
            scanf("%d%d",&x,&y);
            merge(x,y); //合併
        }
        else {
            int x;scanf("%d",&x);
            getfa(x); //計算前先修正
            printf("%d\n",Down[x]);
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章