POJ 1988 Cube Stacking(并查集+路径压缩)
题目链接: id=1988">POJ 1988 Cube Stacking
并查集的题目
【题目大意】
有n个元素,開始每一个元素自己 一栈。有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈。
另外一种操作是询问含有x元素以下有多少个元素。
用sum数组储存每一个栈中的元素个数。每次合并的时候将sum加到 父亲节点。也就是每一个栈的最底部。
用under数组储存当前节点以下有多少元素。每次合并的时候,就能够将顶端元素的under赋值为父节点也就是栈最底部的sum。
void Union(int x,int y){
int xr = find(x);
int yr = find(y);
if(xr==yr) return;
father[xr]=yr;
under[xr]=sum[yr];
sum[yr]+=sum[xr];
}
在查询的时候,运用递归的思想。从底部往上加under。
int find(int x){
if(x==father[x])
return father[x];
int tmp = find(father[x]);
under[x]+=under[father[x]]; //细致想想
father[x]=tmp;
return tmp;
}
【源码】
#include <iostream> //父亲节点在栈的底部
#include <cstdio>
using namespace std;
const int maxn = 30000+10;
int father[maxn];
int under[maxn];
int sum[maxn];
void init(){
for(int i=0;i<maxn;i++){
father[i]=i;
under[i]=0;
sum[i]=1;
}
}
int find(int x){
if(x==father[x])
return father[x];
int tmp = find(father[x]);
under[x]+=under[father[x]];
father[x]=tmp;
return tmp;
}
void Union(int x,int y){
int xr = find(x);
int yr = find(y);
if(xr==yr) return;
father[xr]=yr;
under[xr]=sum[yr];
sum[yr]+=sum[xr];
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
char ch;
int a,b;
init();
for(int i=0;i<n;i++){
scanf(" %c",&ch);
if(ch=='M'){
scanf("%d%d",&a,&b);
Union(a,b);
}
else{
scanf("%d",&a);
int x=find(a); //仅仅是用来累加一下under
printf("%d\n",under[a]);
}
}
}
return 0;
}
POJ 1988 Cube Stacking(并查集+路径压缩)的更多相关文章
- poj.1988.Cube Stacking(并查集)
Cube Stacking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submi ...
- POJ 1988 Cube Stacking( 带权并查集 )*
POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...
- 并查集+路径压缩(poj1988)
http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submiss ...
- hdu 1558 线段相交+并查集路径压缩
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction
http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...
- 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...
- [POJ 1988] Cube Stacking (带值的并查集)
题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x) ...
- POJ 1988 Cube Stacking(带权并查集)
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 23678 Accepted: 8299 Ca ...
- POJ 1988 Cube Stacking 【带权并查集】
<题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所 ...
随机推荐
- 课外作业(建立double类型的小数,按照四舍五入保留2位小数)
举例:
- Microsoft Windows Server 部署
Microsoft Windows Server 部署 多重引导 计算机可以被设置多重引导,即在一台计算机上安装多个操作系统..在安装多重引导的操作系统时,还要注意版本的类型,一般应先安装版本低的,再 ...
- 沈南鹏@《遇见大咖》: A轮没投,投了8个月以后就证明了张一鸣是对了,在美国都没有张一鸣这种模式
沈南鹏@<遇见大咖>: A轮没投,投了8个月以后就证明了张一鸣是对了,在美国都没有张一鸣这种模式
- Eclipse 总是在编译的时候卡住
之前在开发Unieap项目的时候都是很正常,突然有一天早上总是出现Eclipse在编译的时候卡到34%的位置. 解决办法: 点击停止校验,一直卡在那里,首先在任务管理器杀死eclipse和javaw进 ...
- Java笔记:编写第一个Java程序
2017.6.17 1.编写第一个Java程序 创建text文本,命名第一个Java程序.txt 在里面编写Java代码 public class Demo1{ public static void ...
- [CF] 219D Choosing Capital for Treeland
题意翻译 题目描述 Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市.每条道路只能单向通行.现在政府需要决定选择哪个城市为首都.假如城市i成为了首都,那么为了使首都能 ...
- MySQL连接使用及分类
SQL连接 SQL 连接(JOIN)子句用于将数据库中两个或者两个以上表中的记录组合起来.连接通过共有值将不同表中的字段组合在一起. 考虑下面两个表,(a)CUSTOMERS 表:+----+---- ...
- 宝塔apache配置
apache配置 <VirtualHost *:80> ServerAdmin webmaster@example.com DocumentRoot "/www/wwwroot/ ...
- js layui 分页脚本
//分页 layui.use(['laypage'], function(){ var laypage = layui.laypage; laypage.render({ elem: 'page' , ...
- 爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中
爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multi ...