题目

源地址:

http://poj.org/problem?id=1988

理解

这道题也想了很久。问题主要出在堆叠得过程中,我只考虑了根节点的变化,而没有去更新位于同一个根节点下的方块的高度变化。发现问题之后,试图寻找到一种有效得递归方法,但是失败了。无奈之后,决定再开一个deep数组来保存当前节点到根节点之间的深度差。

代码


#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define N 30010

int pre[N], son[N], deep[N];

int find(int x)
{
    int temp;
    if (x == pre[x])
        return x;
    temp = pre[x];
    pre[x] = find(temp);
    deep[x] += deep[temp];
    return pre[x];
}

int main(int argc, char const *argv[])
{
    int p;
    char ope;
    int a, b;
    int query;
    int root1, root2;
    scanf("%d", &p);
    for (int i = 1; i < N; ++i)
    {
        pre[i] = i;
        son[i] = 1;
        deep[i] = 0;
    }
    for (int i = 0; i < p; ++i)
    {
        scanf("%*c%c", &ope);
        if (ope == 'M')
        {
            scanf("%d%d", &a, &b);
            root1 = find(a);
            root2 = find(b);
            if (root1 != root2)
            {
                pre[root2] = root1;
                deep[root2] = son[root1];
                son[root1] += son[root2];
            }
        }
        else
        {
            scanf("%d", &query);
            printf("%d\n", son[find(query)] - deep[query] - 1);
        }
    }
    return 0;
}

更新日志

  • 2014年07月22日 已AC。