P2342 叠积木

    • 17通过
    • 66提交
  • 题目提供者wwqk4444
  • 标签树状数组线段树USACO
  • 难度普及+/提高

提交该题 讨论 题解 记录

最新讨论

  • 暂时没有讨论

题目背景

Cube Stacking, 2004 Open

题目描述

约翰和贝西在叠积木。共有30000块积木,编号为1到30000。一开始,这些积木放在

地上,自然地分成N堆。贝西接受约翰的指示,把一些积木叠在另一些积木的上面。一旦两

块积木相叠, 彼此就再也不会分开了,所以最后叠在一起的积木会越来越高。约翰让贝西依

次执行P条操作,操作分为两种:

 第一种是移动操作,格式为“移动X到Y的上面”。X和Y代表两块积木的编号,意思

是将X所的那堆积木,整体叠放到Y所在的那堆积木之上;

 第二种是统计操作,格式为“统计Z下方的积木数量”。Z代表一块积木的编号,意

思是贝西需要报告在编号为Z的积木之下还有多少块积木

请编写一个程序,帮助贝西回答每条统计问题。

输入输出格式

输入格式:

 第一行:单个整数:P,1 ≤ P ≤ 10^5

 第二行到第P + 1行:每行描述一条命令,如果这行开头的字母是 M,代表一条移动命

令,后面的两个整数代表上文中的X和Y;如果开头字母是 C,代表一条统计命令。后面

的整数代表上文中的Z,保证所有的移动命令都有意义,X和Y不会已经出现在同一堆积

木里

输出格式:

 对每一个统计命令,输出正确回答,用换行符分开每个查询的结果

输入输出样例

输入样例#1:

6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
输出样例#1:

1
0
2

说明

第一次查询时, 1 下面只有一个 6;第二次

查询时, 3 下面没有任何积木;第三次查询时,

4 下面有两块积木:1 和 6

AC代码+题解:

/*
题解:
正确性解释:以底层元素为并查集的代表元素,保证cnt[]更新到底端的时候不会多加,因为cnt[fa[x]]必为0
fa[x]=y; 表示x的父亲是y; (初始化是自身)
top[x]=t;表示x上面的代表编号是t; (初始化是自身)
cnt[x]=t;表示x以下木块的数量是t; (初始化是0)
find()更新时,两堆合并时,利用回溯,更新top[x]=top[t];cnt[x]=cnt[t]+cnt[x];(画图易知)
ps:每次合并或查询,都要find()一次,要不然会WA。
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define N 30010
int fa[N],cnt[N],top[N];
inline int read(){
register int x=,f=;
register char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline char in(){
for(register char ch=getchar();;ch=getchar()) if(ch>='A'&&ch<='Z') return ch;
}
int find(int x){
if(fa[x]==x)return x;
int t=fa[x];
fa[x]=find(fa[x]);
fa[x]=fa[t];
top[x]=top[t];
cnt[x]=cnt[t]+cnt[x];
return fa[x];
}
int main(){
int n,x,y,a,b;char ch;
n=read();
for(int i=;i<=;i++) fa[i]=top[i]=i;
for(int i=;i<=n;i++){
if((ch=in())=='M'){
a=read();b=read();
x=find(a),y=find(b);
fa[x]=y;find(top[y]);
cnt[x]=cnt[top[y]]+;
top[y]=top[x];
}
else{
x=read();find(x);
printf("%d\n",cnt[x]);
}
}
return ;
}

P2342 叠积木的更多相关文章

  1. 洛谷——P2342 叠积木

    P2342 叠积木   题目大意:   给你一堆积木,排成一行,初始时每对积木都只有一个,支持两种操作  第一种是移动操作,格式为“移动X到Y的上面”.X和Y代表两块积木的编号,意思是将X所的那堆积 ...

  2. 洛谷 P2342 叠积木 题解

    本蒟蒻又来发题解了 这题是不是有点像并查集,但是那个询问的个数是不是有点骚: 所以,普通的并查集是无法解决这个问题的,这个时候就需要用到带权并查集了: 每次跑的时候都记录下它的下面有几个点,然后询问的 ...

  3. [US Open 2004][luogu2342] 叠积木 [带权并查集]

    题面 洛谷传送门 思路 害 学了4年多OI,第一次知道还有带权并查集这个东西 wtcl 这个玩意儿的原理和详细实现,可以参考这个博客:带权并查集传送门 这道题,就是在带权并查集的基础上,加个维护每个集 ...

  4. [luoguP2342] 叠积木(并查集)

    传送门 up[i] 表示一个木块上面有多少个 all[i] 表示整个连通块内有多少个 那么 一个木块下面的木块个数为 all[root[i]] - up[i] - 1 注意:up[i] 可以在 fin ...

  5. 洛谷P2342-叠积木

    Problem 洛谷P2342-叠积木 Accept: 373   Submit: 1.1k Time Limit: 1000 mSec    Memory Limit : 128MB Problem ...

  6. 搭积木(block)

    [问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...

  7. 一步步编写avalon组件01:弹出层组件

    avalon2已经稳定下来,是时候教大家如何使用组件这个高级功能了. 组件是我们实现叠积木开发的关键. avalon2实现一个组件非常轻松,并且如何操作这个组件也比以前的avalon2,还是react ...

  8. 【POJ 1988】 Cube Stacking (带权并查集)

    Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...

  9. 掌握一门语言Go

    摘要:Go语言的优势不必多说,通过本篇文章,让我们花时间来掌握一门外语,Let's Go! 关键字:Go语言,闭包,基本语法,函数与方法,指针,slice,defer,channel,goroutin ...

随机推荐

  1. eclipse设置默认编码格式为UTF-8

    需要设置的几处地方为: Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 Window ...

  2. 也来说说C#异步委托(转)

    原文地址: http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html 前些日子,看到园子里面有人用老王喝茶的例子讲解了一下同步和异步, ...

  3. uva387 - A Puzzling Problem

    A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzzle ...

  4. getElementById getElementsByName 赋值

      <script type="text/javascript">                            window.onload=function ...

  5. purge

    RR级别 mysql V5.6 debug ; 测试1 会话1: mysql)); Query OK, rows affected (0.04 sec) mysql,"a"); Q ...

  6. VM参数简介

    http://www.cnblogs.com/yuzhaoxin/p/4083612.html block_dump Linux 内核里提供了一个 block_dump 参数用来把 block 读写( ...

  7. VS2012无法安装cocos2d-x-2.1.4 解决方法及VS2012新建coco2d-x项目(一)

    转自:http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt=1 (注:此方法是可行,仅供参考,建议大家直接看我的 一见命令解决vs安装并创建c ...

  8. android学习日记14--网络通信

    一.Android网络通信 android网络通信一般有三种:java.net.*(标准Java接口).org.apache接口(基于http协议)和android.net.*(Android网络接口 ...

  9. IOS开发UI篇--使用CAShapeLayer实现复杂的View的遮罩效果

    一.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者.服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定 ...

  10. C# 之 FileSystemWatcher事件多次触发的解决方法

    1.问题描述  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理.于是使用了下面的代码: public void Initial() { ...