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

题意:有n个龙珠,n个城市。初始状态第i个龙珠在第i个城市里。接下来有两个操作:

T A B:把A号龙珠所在的城市的所有龙珠全部转移到B城市中。

Q A:查询A龙珠,要求:A龙珠所在城市,该城市龙珠数量,A移动的次数。

思路:用并查集可以轻松解决Q的前两个问题。关键在于如何统计A的移动次数,因为在T的时候是要将A所在城市的所有龙珠都要转移到B,那就要A集合里所有龙珠的移动次数都+1。假如我们在每一次转移前都去遍历一遍集合,显然是会TLE的,于是想了一个懒惰更新的方法。就是每次移动的时候只更新当前根节点的移动次数+1,合并的时候并在另一个树的根节点上。下一次移动这一个整棵树的时候必然要路径压缩,在路径压缩的时候将之前未更新的值更新即可。

  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 lp p << 1
  54. #define rp p << 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 n, q;
  72. int pre[maxn];
  73. int t[maxn], c[maxn];
  74.  
  75. int find(int x) {
  76. if(pre[x] == x) RT x;
  77. int px = pre[x];
  78. pre[x] = find(pre[x]);
  79. t[x] += t[px];
  80. RT pre[x];
  81. }
  82.  
  83. void unite(int x, int y) {
  84. int fx = find(x);
  85. int fy = find(y);
  86. if(fx != fy) {
  87. pre[fx] = fy;
  88. t[fx]++;
  89. c[fy] += c[fx]; c[fx] = ;
  90. }
  91. }
  92.  
  93. int main() {
  94. // FRead();
  95. int T, _ = ;
  96. int a, b;
  97. char cmd[];
  98. Rint(T);
  99. W(T) {
  100. Rint(n); Rint(q);
  101. Cls(t);
  102. Rep(i, n+) c[i] = , pre[i] = i;
  103. printf("Case %d:\n", _++);
  104. W(q) {
  105. Rs(cmd);
  106. if(cmd[] == 'T') {
  107. Rint(a); Rint(b);
  108. unite(a, b);
  109. }
  110. if(cmd[] == 'Q') {
  111. Rint(a);
  112. int fa = find(a);
  113. printf("%d %d %d\n", fa, c[fa], t[a]);
  114. }
  115. }
  116. }
  117. RT ;
  118. }

[HDOJ3635]Dragon Balls(并查集,路径压缩)的更多相关文章

  1. 并查集+路径压缩(poj1988)

    http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submiss ...

  2. hdu 1558 线段相交+并查集路径压缩

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  4. 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network

    Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...

  5. hdu 3635 Dragon Balls(并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. HDOJ 3635 并查集- 路径压缩,带秩合并

    思路来源:http://blog.csdn.net/niushuai666/article/details/6990421 题目大意: 初始时,有n个龙珠,编号从1到n,分别对应的放在编号从1到n的城 ...

  7. LA 并查集路径压缩

    题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...

  8. snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)

    1110: 传输网络 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 18[Submit][Status][Web Board] ...

  9. - > 并查集+路径压缩(详解)(第一节)

    先举一个友爱的例子解释一下并查集: 话说江湖上散落着各式各样的大侠,有上千个之多. 他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义 ...

  10. PAT甲级1013题解——并查集+路径压缩

    题目分析: 本题初步浏览题目就知道是并查集的模板题,数据输入范围N为1~1000,则M的范围为0~1000^2,通过结构体记录每一对连线的关系,p[]数组记录每个节点的跟,对于k次查询,每次都要重新维 ...

随机推荐

  1. matlab实现高斯牛顿法、Levenberg–Marquardt方法

    高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...

  2. iTween基础之Audio(音量和音调的变化)

    一.基础介绍:二.基础属性 原文地址 : http://blog.csdn.net/dingkun520wy/article/details/50826033 一.基础介绍 AudioTo:改变声音的 ...

  3. python学习小结6:模块

    模块:在Python中有一个概念叫做模块(module),简单地说,模块就是一个保存了Python代码的文件.          模块能定义函数,类和变量,模块里也能包含可执行的代码.         ...

  4. AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)

    随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...

  5. Oppotunity land---China

    China is a land of opportunity.Following the development of China,every sector has made their contri ...

  6. html+css学习笔记 4[定位]

    如何让图1中的div2移动到如图2上的位置: 思路:哪些css命令能够影响盒子显示的位置呢? relative相对定位/定位偏移量 position:relative;  相对定位         a ...

  7. POJ 3164 Command Network 最小树形图

    题目链接: 题目 Command Network Time Limit: 1000MS Memory Limit: 131072K 问题描述 After a long lasting war on w ...

  8. Ext学习-高级组件介绍

    在这一部分的学习中,主要是学习一些比较特殊的组件. 1.图表 2.日历 3.颜色,日期,时间的选择器 4.滑动条 5.各种工具类 参考文档:http://docs.sencha.com/extjs/4 ...

  9. [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】

    题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...

  10. 【Vijos】【1164】曹冲养猪

    中国剩余定理 没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?) 这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=.=至于怎么想到这种构造方法的……去问 ...