luogu P5092 [USACO2004OPEN]Cube Stacking 方块游戏

题目描述

约翰和贝茜在玩一个方块游戏。编号为 1…n 1\ldots n 1…n 的 n n n ( 1≤n≤30000 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱。

游戏开始后,约翰会给贝茜发出 P P P ( 1≤P≤100000 1 \leq P \leq 100000 1≤P≤100000 )个指令。指令有两种:

  1. 移动(M):将包含X的立方柱移动到包含Y的立方柱上。
  2. 统计(C):统计含X的立方柱中,在X下方的方块数目。

写个程序帮贝茜完成游戏。

输入格式

第1行输入 P P P ,之后 P P P 行每行输入一条指令,形式为“M X Y”或者“C X”。

输入保证不会有将立方柱放在自己头上的指令。

输出格式

输出共 P P P 行,对于每个统计指令,输出其结果。

输入输出样例

输入 #1 复制

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

输出 #1 复制

1
0
2

元素到根的距离 记住 每次合并时才会有赋值

code:
//
#include<bits/stdc++.h>
using namespace std;
int n,p;
#define maxnn 40100
int f[maxnn],dis[maxnn],cnt[maxnn];
int  gf(int v,int num)
{
    if(f[v]==v)
    {
        cnt[v]+=num;
        return v;
    }
    else
    {
        int fx=f[v];
        f[v]=gf(f[v],num);
        if(f[v]!=fx)
        dis[v]=dis[v]+dis[fx];
        return f[v];
    }
}
int main()
{
    char a;
    cin>>p;
    int x,y;
    for(int i=1;i<=40000;i++)
    f[i]=i,dis[i]=0,cnt[i]=1;

    for(int i=1;i<=p;i++)
    {
        cin>>a;
        if(a==‘M‘)
        {
            cin>>x>>y;
            int fy=gf(y,0);
            if(gf(y,0)!=gf(x,0))
            {
            dis[gf(y,0)]=cnt[gf(x,0)];
            f[gf(y,0)]=gf(x,0);
            cnt[gf(x,0)]+=cnt[fy];
            }
        }
        else
        {
            cin>>x;

            {
            gf(x,0);
            cout<<abs(dis[x]-cnt[gf(x,0)])-1<<endl;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/OIEREDSION/p/11260182.html

时间: 2024-10-04 04:44:11

luogu P5092 [USACO2004OPEN]Cube Stacking 方块游戏的相关文章

【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集

这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. #include <cstdio> #include <cstring> const int N=30050; int h[N],f[N],size[N]; char s[2]; inline int find(int x){ if(f[x]==x)return x; int temp

POJ 1988 Cube Stacking(转)

这道题的思路,就是每次记下该点到父结点的个数,并记录下其下的结点个数.之后,每次"C"时,将总的减去它所压的方块,即答案!!!(也是参考别人的~-?) <pre name="code" class="cpp">#include<stdio.h> #include<iostream> using namespace std; #define max 30010 struct node { int parent;/

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

hust 1590 - 方块游戏 数学

1590 - 方块游戏 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1590 Description BG和ZZ一起玩一个游戏,游戏规则如下:        游戏开始时画在一张纸上,纸上画有n*m个方块组成的格子,BG和ZZ轮流玩这个游戏,BG先开始.每一轮玩家都会在上一次的方框内框出一个小方框作为下一轮的方框,这个小方框的边和原先的方框的边不能够有交集.        这个游

poj.1988.Cube Stacking(并查集)

Cube Stacking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1988 Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They st

方块游戏—题解

1590 - 方块游戏 Time Limit: 1s Memory Limit: 128MB Submissions: 33 Solved: 13 DescriptionBG和ZZ一起玩一个游戏,游戏规则如下: 游戏开始时画在一张纸上,纸上画有n*m个方块组成的格子,BG和ZZ轮流玩这个游戏,BG先开始.每一轮玩家都会在上一次的方框内框出一个小方框作为下一轮的方框,这个小方框的边和原先的方框的边不能够有交集. 这个游戏没有赢家,BG和ZZ只是不断的缩小方框,直到游戏进行k轮.现求游戏有多少种方法

加权并查集——(POJ1988)Cube Stacking

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 25647   Accepted: 8975 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

Cube Stacking

Cube Stacking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status 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,

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 w