一、题目回顾

题目链接:Cube Stacking

题意:有n个箱子,初始时每个箱子单独为一列;接下来有p行输入,M, x, y 或者 C, x;

  • 对于M,x,y:表示将x箱子所在的一列箱子搬到y所在的一列箱子上;
  • 对于C,x:表示求箱子x下面有多少个箱子;

输出:在箱子x所在的那列中,求出在x之下的cube的个数。

二、解题分析

知识点:带权并查集

解题思路

  • 初级:M x y是将x所在列的所有箱子叠到y所在列的上面,如果直接模拟的话就是将x最末端的叶子节点当做y的根节点的父亲节点合并,不过那样的话不好压缩路径,不压缩路径的话会超时.......
  • 高级:用数组s存储当前节点x的子结点数量,用数组d存储当前节点到根节点的距离,所求值即s[find(x)]-d[x],(也许你会说要求的不就是s[x]吗,道理是这样,但我们并没有求出每个节点的子结点数量)
  • 续上高级:按照一般并查集的合并方法,令pre[find(y)]=find(x);那合并后会有: d[find(y)]=s[find(x)]+1,s[find(x)]+=s[find(y)]+1 。(不清楚可以自己在草稿纸上画图确定)

重要之处

  • 多了两个结点之间的关系
  1. d[x]表示结点x到根的距离
  2. s[x]表示在结点x下cube的数量
  • 然后在find函数、unite函数内维持这两个数组即可

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p;
int pre[];
int d[]; //d[x]表示结点x到根的距离
int s[]; //s[x]表示在结点x下cube的数量
void init()
{
for(int i=;i<=;i++){
pre[i] = i;
// d[i] = 0; 加上这个就 WA
s[i] = ;
}
} int find(int x)
{
if(x==pre[x]) return x;
int t = pre[x]; //***递归思想,t为存储x改变根节点后的根节点的临时变量
pre[x] = find(pre[x]);
d[x] = d[x] + d[t]; //***x到改变前根节点的距离即x到t的距离加上t到根节点的距离
return pre[x];
} void unite(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx != fy){
pre[fy] = fx;
//***将x所在列放到y所在列上面后,find(y)到新合并后的根节点的距离即为合并前find(x)的子树的大小
d[fy] = s[fx]+;
s[fx] = s[fx]+(s[fy]+); //***合并后find(x)的子树大小即为合并前find(x)与find(y)的子树大小的和
}
} int main()
{ cin>>p;
init();
char ch; int x,y;
getchar();
while(p--){
scanf("%c",&ch);
if(ch=='M'){
scanf("%d%d",&x,&y);
unite(x,y);
}
if(ch=='C'){
scanf("%d",&x);
//***注意这里并不是输出son(x),因为我们并没有求出每个节点的子树的大小
printf("%d\n",s[find(x)]-d[x]);
}
getchar();
}
return ;
}

并查集——poj1988(带权并查集中等)的更多相关文章

  1. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  2. 并查集模板 && 带权并查集模板

    不带权: ]; void init(void) { ;i<=n;i++) f[i]=i; } int fd(int x) { return f[x]==x?x:fd[x]=fd(f[x]); } ...

  3. hdu 2818(并查集,带权更新)

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. LA 6187 - Never Wait for Weights 并查集的带权路径压缩

    只有一个地方需要注意: 设节点a的根为u,b的跟为v,则:a = u + d[a];  b = v + d[b]; 已知:b-a=w.所以v - u = d[a] - d[b] + w; 在合并两个集 ...

  5. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  6. bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...

  7. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

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

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  9. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

随机推荐

  1. 课时15.DTD文档声明下(了解)

    W3C的官方网站是W3School,我们可以去官方网站查询DTD文档声明. HTML4.01       Strict  非常严谨的 如果你写了这个DTD文档声明,你就不能写如下样式: <fon ...

  2. 辨析:Object与Instance都是对象,概念上没有区别。

    Object与Instance有重要的区别:Object是客观世界中存在的实体:Instance是将Object虚拟到计算机世界的实例,它的生存方式是可运行的代码,它的生存环境是计算机中的内存资源,生 ...

  3. $CRS_HOME/cdata下大量数字命名的文件,占用空间大

    问题现象:    <CRS_HOME>/cdata目录下存在大量数字命名的文件,导致文件系统爆满 $ls -alrth /opt/oracle/product/CRS/cdata/crs ...

  4. C#判断系统是64位还是32位 支持.net4.0以前的版本

    C#判断系统是64位还是32位的时候引用了一串代码,这个代码是从园子里面其他博文中转载过来的,引入自己的项目中发现无法使用,在引用了相应的命名空间之后还是提示: "未能找到类型或命名空间名称 ...

  5. 关于python的GIL

    转自依云在知乎上的回答,链接为https://www.zhihu.com/question/27245271/answer/462975593 侵删. python的多线程,其实不是真的多线程,它会通 ...

  6. webpack和sass功能简介

    1.webpack webpack 是一个打包工具,为什么需要打包?因为有的人的脚本开发语言可能是 CoffeeScript 或者是 TypeScript,样式开发工具可能是 Less 或者 Sass ...

  7. ODBC error in PHP: “No tuples available at this result index”

    ODBC error in PHP: “No tuples available at this result index” 在执行存储过程的时候发生如题的错误,在stackoverflow上找到了相同 ...

  8. 爬虫之request模块高级

    一.cookie&session cookie:服务器端使用cookie来记录客户端的状态信息 实现流程: 执行登陆操作(获取cookie) 在发起个人主页请求时,需要将cookie携带到该请 ...

  9. 预防跨站脚本(xss)

    对xss的防护方法结合在两点上输入和输出,一是严格控制用户表单的输入,验证所有输入数据,有效监测到攻击,go web表单中涉及到.二是对所有输出的数据进行处理,防止已成功注入的脚本在浏览器端运行. 在 ...

  10. 密码发生器 南阳acm519

    密码发生器 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如 ...