POJ1988-Cube Stacking(带权并查集)

来源:互联网 发布:python itemgetter 编辑:程序博客网 时间:2024/05/16 06:48
Cube Stacking
Time Limit: 2000MS Memory Limit: 30000KTotal Submissions: 18858 Accepted: 6547Case Time Limit: 1000MS

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

6M 1 6C 1M 2 4M 2 6C 3C 4

Sample Output

102
题意:n个方块(n<=30000),p组操作(p<=100000),操作有两种,M a b 将含有a的堆放在包含b的堆上,还有一种是 C a统计a下面有多少个方块
思路:带权并查集,一堆中最顶上的方块作为父节点,用dist[X] 统计X到父亲节点的距离,rank[fa[X]]表示团的大小,两者相减即为答案
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <string>#include <algorithm>#include <queue>using namespace std;const int maxn = 30000+10;int fa[maxn];int rank[maxn];int dist[maxn];void init(){    for(int i = 0; i < maxn; i++){        fa[i] = i;        rank[i] = 1;        dist[i] = 0;    }}int find(int x){    if(x != fa[x]){        int t = fa[x];        fa[x] = find(fa[x]);        dist[x] += dist[t];    }    return fa[x];}int main(){    int n;    while(~scanf("%d",&n)){        init();        char op;        while(n--){            cin >> op;            int a,b;            if(op=='M'){                scanf("%d%d",&a,&b);                int faA = find(a);                int faB = find(b);                if(faA != faB){                    fa[faB] = faA;                    dist[faB] = rank[faA];                    rank[faA] += rank[faB];                }            }else{                scanf("%d",&a);                int x = find(a);                printf("%d\n",rank[x]-dist[a]-1);            }        }    }    return 0;}


0 0