I hope you know the beautiful Union-Find structure. In this problem, you’re to implement something similar, but not identical. The data structure you need to write is also a collection of disjoint sets, supporting 3 operations:

Initially, the collection contains n sets: {1}, {2}, {3}, . . . , {n}.

题意:

涉及到并查集的删除操作
1 合并这两个集合
2 将p移到q集合中去
3 统计元素个数和全部元素的和 相当于询问输出结果

5 7 ->5个集合,7种操作
1 1 2
2 3 4
1 3 5
3 4 ->3 12
2 4 1
3 4 ->3 7
3 3 ->2 8

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. const int N=1e5+;
  7. int f[N*],ii[N*],num[N*];
  8. ll sum[N*];
  9. int n,m,cnt;
  10.  
  11. void init()
  12. {
  13. for(int i=;i<=n;i++)
  14. {
  15. f[i]=i;
  16. ii[i]=i;
  17. sum[i]=i;
  18. num[i]=;
  19. }
  20. cnt=n;
  21. }
  22.  
  23. int getf(int x)
  24. {
  25. if(f[x]==x)
  26. return x;
  27. return f[x]=getf(f[x]);
  28. }
  29.  
  30. void merge(int x,int y)
  31. {
  32. int t1=getf(ii[x]);
  33. int t2=getf(ii[y]);
  34. if(t1!=t2)
  35. f[t2]=t1;
  36. num[t1]+=num[t2];
  37. sum[t1]+=sum[t2];
  38. }
  39.  
  40. void deletee(int x)
  41. {
  42. int p=ii[x];
  43. sum[getf(p)]-=x;
  44. num[getf(p)]--;
  45. ii[x]=++cnt;
  46. sum[ii[x]]=x;
  47. num[ii[x]]=;
  48. f[ii[x]]=ii[x];
  49. }
  50.  
  51. int main()
  52. {
  53. int op,p,q;
  54. while(~scanf("%d %d",&n,&m))
  55. {
  56. init();
  57. for(int i=;i<=m;i++)
  58. {
  59. scanf("%d",&op);
  60. if(op==)//合并这两个集合
  61. {
  62. scanf("%d %d",&p,&q);
  63. if(getf(ii[p])==getf(ii[q]))
  64. continue;
  65. else
  66. merge(p,q);
  67. }
  68. else if(op==)//将p移到q集合中去
  69. {
  70. scanf("%d %d",&p,&q);
  71. if(getf(ii[p])!=getf(ii[q]))//如果不在同一个集合中
  72. {
  73. deletee(p);
  74. merge(p,q);
  75. }
  76. }
  77. else if(op==)//统计元素个数和全部元素的和 相当于询问输出结果
  78. {
  79. scanf("%d",&p);
  80. int k=getf(ii[p]);
  81. printf("%d %lld\n",num[k],sum[k]);
  82. }
  83. }
  84. }
  85. return ;
  86. }

UVA-11987-Almost Union-Find-并查集的基本操作合并、删除、移位的更多相关文章

  1. UVA 11987 Almost Union-Find (并查集+删边)

    开始给你n个集合,m种操作,初始集合:{1}, {2}, {3}, … , {n} 操作有三种: 1 xx1 yy1 : 合并xx1与yy1两个集合 2 xx1 yy1 :将xx1元素分离出来合到yy ...

  2. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  3. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

  4. 【bzoj4668】冷战 并查集按秩合并+朴素LCA

    题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...

  5. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  6. Dash Speed【好题,分治,并查集按秩合并】

    Dash Speed Online Judge:NOIP2016十联测,Claris#2 T3 Label:好题,分治,并查集按秩合并,LCA 题目描述 比特山是比特镇的飙车圣地.在比特山上一共有 n ...

  7. UVA 572 油田连通块-并查集解决

    题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...

  8. UVA 12232 - Exclusive-OR(带权并查集)

    UVA 12232 - Exclusive-OR 题目链接 题意:有n个数字.一開始值都不知道,每次给定一个操作,I a v表示确认a值为v,I a b v,表示确认a^b = v,Q k a1 a2 ...

  9. UVA 1160 - X-Plosives 即LA3644 并查集判断是否存在环

    X-Plosives A secret service developed a new kind ofexplosive that attain its volatile property only ...

随机推荐

  1. MyBatis中大于和小于号的转义写法

    mybatis 中 SQL 写在mapper.xml文件中,而xml解析 < .>.<=.>= 时会出错,这时应该使用转义写法. 方式一 < <= > > ...

  2. bean创建

    看<spring源码解析>的笔记 1.通过@Bean创建bean,类上需要添加@Configuration @Configuration public class MainConfig { ...

  3. MySql 字段类型对应 Java 实体类型

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  4. java script 基本函数

    Math.random()    是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. 日期时间函数(需要用变量调用):var b = new Date();      // ...

  5. bzoj1008题解

    [题意分析] 求长度为n,元素大小在[1,m]∩N的序列中,有多少个序列中存在相同的相邻元素. [解题思路] 小学奥数题.. 总序列数:S=mn 不存在相同的相邻元素的序列数:T=m*(m-1)n-1 ...

  6. NX二次开发-创建直线UF_CURVE_create_line与NXOpen->CreateLine

    NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <NXOpen/CurveCollection.hx ...

  7. 测试VPS

    wget freevps.us/downloads/bench.sh -O - -o /dev/null|bash

  8. 《DSP using MATLAB》Problem 8.42

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  9. 将Mysq数据导入solr索引库

    本文的基础环境都是在centos 64bit,jdk1.7.79 将mysql 的jar 包添加到/home/hadoop/cloudsolr/solr-4.10.4/contrib/dataimpo ...

  10. C++之变量

    变量 **作用**:给一段指定的内存空间起名,方便操作这段内存 **语法**:数据类型 变量名 = 初始值; 语法:数据类型  变量名 = 初始值;   记得加英文分号结束语句 > 注意:C++ ...