题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818

题意:有N个块,每次有两个操作:

M x y表示把x所在的那一堆全部移到y所在的那一堆的下方。

C x 询问在x下方有多少个方块。

用并查集,在路径压缩的时候后序更新当前块下有多少个其他块,注意这里“当前块下”其实和并查集是相反的,也就是父亲节点在儿子下面。

需要额外维护一个量:某一堆的块的总数,这个在unite操作的时候,如果不是同一个根,直接将一部分加到另一部分上就可以。

  1. /*
  2. ━━━━━┒ギリギリ♂ eye!
  3. ┓┏┓┏┓┃キリキリ♂ mind!
  4. ┛┗┛┗┛┃\○/
  5. ┓┏┓┏┓┃ /
  6. ┛┗┛┗┛┃ノ)
  7. ┓┏┓┏┓┃
  8. ┛┗┛┗┛┃
  9. ┓┏┓┏┓┃
  10. ┛┗┛┗┛┃
  11. ┓┏┓┏┓┃
  12. ┛┗┛┗┛┃
  13. ┓┏┓┏┓┃
  14. ┃┃┃┃┃┃
  15. ┻┻┻┻┻┻
  16. */
  17. #include <algorithm>
  18. #include <iostream>
  19. #include <iomanip>
  20. #include <cstring>
  21. #include <climits>
  22. #include <complex>
  23. #include <fstream>
  24. #include <cassert>
  25. #include <cstdio>
  26. #include <bitset>
  27. #include <vector>
  28. #include <deque>
  29. #include <queue>
  30. #include <stack>
  31. #include <ctime>
  32. #include <set>
  33. #include <map>
  34. #include <cmath>
  35. using namespace std;
  36. #define fr first
  37. #define sc second
  38. #define cl clear
  39. #define BUG puts("here!!!")
  40. #define W(a) while(a--)
  41. #define pb(a) push_back(a)
  42. #define Rint(a) scanf("%d", &a)
  43. #define Rll(a) scanf("%lld", &a)
  44. #define Rs(a) scanf("%s", a)
  45. #define Cin(a) cin >> a
  46. #define FRead() freopen("in", "r", stdin)
  47. #define FWrite() freopen("out", "w", stdout)
  48. #define Rep(i, len) for(int i = 0; i < (len); i++)
  49. #define For(i, a, len) for(int i = (a); i < (len); i++)
  50. #define Cls(a) memset((a), 0, sizeof(a))
  51. #define Clr(a, x) memset((a), (x), sizeof(a))
  52. #define Full(a) memset((a), 0x7f7f, sizeof(a))
  53. #define lrt rt << 1
  54. #define rrt rt << 1 | 1
  55. #define pi 3.14159265359
  56. #define RT return
  57. #define lowbit(x) x & (-x)
  58. #define onenum(x) __builtin_popcount(x)
  59. typedef long long LL;
  60. typedef long double LD;
  61. typedef unsigned long long ULL;
  62. typedef pair<int, int> pii;
  63. typedef pair<string, int> psi;
  64. typedef map<string, int> msi;
  65. typedef vector<int> vi;
  66. typedef vector<LL> vl;
  67. typedef vector<vl> vvl;
  68. typedef vector<bool> vb;
  69.  
  70. const int maxn = ;
  71. int pre[maxn];
  72. int under[maxn];
  73. int num[maxn];
  74. int p;
  75.  
  76. int find(int x) {
  77. if(x == pre[x]) RT x;
  78. int px = pre[x];
  79. pre[x] = find(pre[x]);
  80. under[x] += under[px];
  81. RT pre[x];
  82. }
  83.  
  84. void unite(int x, int y) {
  85. int fx = find(x);
  86. int fy = find(y);
  87. if(fx != fy) {
  88. under[fx] = num[fy];
  89. num[fy] += num[fx];
  90. pre[fx] = fy;
  91. }
  92. }
  93.  
  94. int main() {
  95. // FRead();
  96. char cmd[];
  97. int u, v;
  98. while(~Rint(p)) {
  99. Cls(under);
  100. Rep(i, maxn) {
  101. pre[i] = i;
  102. num[i] = ;
  103. }
  104. W(p) {
  105. Rs(cmd);
  106. if(cmd[] == 'M') {
  107. Rint(u); Rint(v);
  108. unite(u, v);
  109. }
  110. if(cmd[] == 'C') {
  111. Rint(u); find(u);
  112. printf("%d\n", under[u]);
  113. }
  114. }
  115. }
  116. RT ;
  117. }

[HDOJ2818]Building Block(带权并查集,路径压缩)的更多相关文章

  1. hdu 2818 Building Block (带权并查集,很优美的题目)

    Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...

  2. Never Wait for Weights(带权并查集+路径压缩)

    题目链接:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2209#problem/F !a b w 表示b比a大w ?  a b  输出 ...

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

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

  4. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  5. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  6. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  7. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

  8. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

  9. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  10. poj1984 带权并查集

    题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...

随机推荐

  1. 关于WP8 微信分享的补充说明

    1.根据微信官方Demo完成相应功能. 2.在分享完后,从微信回来,需要进行 快速恢复. 3.在快速恢复中加入 RootFrame.Navigating += HandlerFotResetNavig ...

  2. Struts之ForwardAction

    在Struts中,通过action跳转jsp,但是有时希望仅仅只是跳转页面,而不需要action,这时可以用ForwardAction. 定义一个仅仅是跳转的ForwardAction如下: < ...

  3. android 开发上传图片遇到返回 FileNotFoundException

    目的:带有参数上传图片 环境:客户端开发 android studio  ,服务器端:visual studio 2012 (c# asp.net) ************************* ...

  4. 仅仅测试Word2016发布博客

    我来啦! 我走啦!     哈哈哈!   int main(int argc, char *argv[]) {     int mysocket; //建立一个socket后返回的值是int类型的. ...

  5. 【BZOJ】【1086】 【SCOI2005】王室联邦

    树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...

  6. sampler2d

    Here is the syntax for a sampler in Direct3D 9. sampler Name = SamplerType{   Texture = <texture_ ...

  7. synergy--共享你的键鼠

    synergy用来分享一套键鼠,作用于多台主机.可作用于linux.Windows和mac平台.工作方式是:将一台主机作为服务器端,然后服务器端将会分享自己的键鼠,另一台主机作为客户端连接服务端就可以 ...

  8. eclipse 开发技巧

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...

  9. 【redis】05Redis的常用命令及高级应用

    Redis常用命令     Redis提供了非常丰富的命令,对数据库和个中数据类型进行操作, 这些命令呢,可以在Linux终端使用. 分为两大类的命令,一种是键值相关的命令,一种是服务器相关的命令, ...

  10. 使用Flexible实现手淘H5页面的终端适配【转】

    曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...