POJ 1988 Cube Stacking

    xiaoxiao2022-06-30  61

    Description

    Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two types of operations: moves and counts. * In a move operation, Farmer John asks Bessie to move the stack containing cube X on top of the stack containing cube Y. * In a count operation, Farmer John asks Bessie to count the number of cubes on the stack with cube X that are under the cube X and report that value.

    Write a program that can verify the results of the game. Input

    Line 1: A single integer, P

    Lines 2..P+1: Each of these lines describes a legal operation. Line 2 describes the first operation, etc. Each line begins with a ‘M’ for a move operation or a ‘C’ for a count operation. For move operations, the line also contains two integers: X and Y.For count operations, the line also contains a single integer: X.

    Note that the value for N does not appear in the input file. No move operation will request a move a stack onto itself. Output

    Print the output from each of the count operations in the same order as the input file. Sample Input

    6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4 Sample Output

    1 0 2


    【题意】

    有几个stack,初始里面有一个cube。支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部。2.count x:数在x所在stack中,在x之下的cube的个数。

    【题解】

    并查集。与银河英雄传说类似。

    维护两个量s[x]和d[x],表示子树大小和到根的距离。


    #include<iostream> #include<cstdio> using namespace std; const int maxn=30000; int p; struct cb { int fa,num,sz; }a[maxn+5]; int fnd(int x) { if(a[x].fa!=x) { int ff=a[x].fa; a[x].fa=fnd(ff); a[x].num+=a[ff].num-1; } return a[x].fa; } int main() { for(int i=1;i<=maxn;i++) a[i].fa=i,a[i].sz=1,a[i].num=1; scanf("%d",&p); char ch[11]; int x,y; while(p--) { scanf("%s",ch); if(ch[0]=='M') { scanf("%d%d",&x,&y); int fx=fnd(x),fy=fnd(y); a[fx].num+=a[fy].sz; a[fy].sz+=a[fx].sz; a[fx].fa=fy; } else { scanf("%d",&x); fnd(x); printf("%d\n",a[x].num-1); } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1125797.html

    最新回复(0)