HDU 1988 Cube Stacking (数据结构-并查集)

Cube Stacking

Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 18900   Accepted: 6568
Case 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

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

Sample Output

1
0
2

Source

USACO 2004 U S Open

题目大意:

有N个立方体和N个格子,1~N编号,一开始i立方体在i号格子上,每个格子刚好1个立方体。现在m组操作,M a b表示将a号立方体所在的格子的全部立方体放在b号立方体所在的格子的全部立方体上面。C x表示询问x号立方体下面的立方体的个数。

解题思路:

在并查集的基础上,只需要知道x到父亲的距离以及父亲到底的距离就知道x到底的距离。sum[i]记录与根的距离,不断维护。

参考代码:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

const int MAXN = 30010;
int p;
int father[MAXN], sum[MAXN], num[MAXN];

void init() {
    for (int i = 1; i <= 30000; i++) {
        father[i] = i;
        sum[i] = 0;
        num[i] = 1;
    }
}

int find_set(int x) {
    int tmp = father[x];
    if (father[x] != x) {
        father[x] = find_set(father[x]);
        sum[x] += sum[tmp];
    }
    return father[x];
}

void union_set(int x, int y) {
    x = find_set(x);
    y = find_set(y);
    if (x == y) return;
    father[x] = y;
    sum[x] += num[y];
    num[y] += num[x];
}

void solve() {
    for (int k = 0; k < p; k++) {
        char op;
        cin >> op;
        if (op == 'M') {
            int x, y, posx;
            cin >> x >> y;
            union_set(x, y);
        } else if (op == 'C') {
            int x, cnt = 0;
            cin >> x;
            find_set(x);
            cout << sum[x] << endl;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    while (cin >> p) {
        init();
        solve();
    }
    return 0;
}

HDU 1988 Cube Stacking (数据结构-并查集)

时间: 2024-10-12 18:52:57

HDU 1988 Cube Stacking (数据结构-并查集)的相关文章

POJ 1988 Cube Stacking(并查集+路径压缩)

题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈. 另外一种操作是询问含有x元素以下有多少个元素. 用sum数组储存每一个栈中的元素个数.每次合并的时候将sum加到 父亲节点.也就是每一个栈的最底部. 用under数组储存当前节点以下有多少元素.每次合并的时候,就能够将顶端元素的under赋值为父节点也就是栈最底部的sum. void U

POJ 1988 Cube Stacking (种类并查集)

题目地址:POJ 1988 这道题的查找合并的方法都能想的到,就是一点没想到,我一直天真的以为查询的时候,输入后能马上输出,这样的话在合并的时候就要所有的结点值都要算出来,但是经过路径压缩之后,没办法全部都处理到,如果不压缩妥妥的TLE..于是看了看网上的题解.才发现自己是多么的天真(ben,四声)..在查询的时候只要找一次跟就可以了..这样不需查询的也就没必要处理出来.反而更省时. 这题的基本思路是很好想的.另开两个数组,一个记录以此节点为根的子节点的数目(这样合并的时候只需要加另一个根的数目

HDU 1988 Cube Stacking (数据结构-并检查集合)

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18834   Accepted: 6535 Case 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 w

poj1988 Cube Stacking(并查集

题目地址:http://poj.org/problem?id=1988 题意:共n个数,p个操作.输入p.有两个操作M和C.M x y表示把x所在的栈放到y所在的栈上(比如M 2 6:[2 4]放到[1 6]上为[2 4 1 6]),C x为输出x下面有几个数. 思路:并查集每个集合以栈最下面的数为根,维护两个数组num[x]表示x所在集合节点总数,count[x]表示x下方节点个数.每次查找压缩路径的时候更新count(换父节点的时候每轮都把父节点的count加给儿子,就可以一直更新到x所在栈

【POJ-1988】Cube Stacking(并查集)

//===================================== // KinderRiven POJ 1899 //===================================== #include<cstdio> #include<cstring> using namespace std; const int maxn = 33333; const int INF = 30000; int fa[maxn]; //父亲结点的编号 int ret[maxn

POJ 1988 Cube Stacking

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18820   Accepted: 6530 Case 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 w

POJ 1984 Navigation Nightmare (数据结构-并查集)

Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4072   Accepted: 1615 Case Time Limit: 1000MS Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series o

HDU 3635 延缓更新的并查集

Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2839    Accepted Submission(s): 1097 Problem Description Five hundred years later, the number of dragon balls will increase unexpecte

POJ 1703 Find them, Catch them(数据结构-并查集)

Find them, Catch them Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal b