可以说是线段树合并的裸题吧

题意就是给你两个操作

一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第k小元素

另一个操作就是查询区间极值了

  1. #include<cstdio>
  2. const int maxn=;
  3. int n,m,sz;
  4. int v[maxn],id[maxn],fa[maxn],root[maxn];
  5. int lch[],rch[],sum[];
  6. inline int read()
  7. {
  8. int x=,f=;char ch=getchar();
  9. while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
  10. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  11. return x*f;
  12. }
  13. int find(int x)
  14. {
  15. return x==fa[x]?x:fa[x]=find(fa[x]);
  16. }
  17. void insert(int &k,int l,int r,int val)
  18. {
  19. if(k==) k=++sz;
  20. if(l==r)
  21. {
  22. sum[k]=;return;
  23. }
  24. int mid=(l+r)>>;
  25. if(val<=mid) insert(lch[k],l,mid,val);
  26. else insert(rch[k],mid+,r,val);
  27. sum[k]=sum[lch[k]]+sum[rch[k]];
  28. }
  29. int query(int k,int l,int r,int rank)
  30. {
  31. if(l==r) return l;
  32. int mid=(l+r)>>;
  33. if(sum[lch[k]]>=rank) return query(lch[k],l,mid,rank);
  34. else return query(rch[k],mid+,r,rank-sum[lch[k]]);
  35. }
  36. int merge(int x,int y)
  37. {
  38. if(x==) return y;
  39. if(y==) return x;
  40. lch[x]=merge(lch[x],lch[y]);
  41. rch[x]=merge(rch[x],rch[y]);
  42. sum[x]=sum[lch[x]]+sum[rch[x]];
  43. return x;
  44. }
  45. int main()
  46. {
  47. n=read();m=read();
  48. for(int i=;i<=n;i++) v[i]=read();
  49. for(int i=;i<=n;i++) fa[i]=i;
  50. int x,y;
  51. for(int i=;i<=m;i++)
  52. {
  53. x=read(),y=read();
  54. int p=find(x),q=find(y);
  55. fa[p]=q;
  56. }
  57. for(int i=;i<=n;i++)
  58. {
  59. insert(root[find(i)],,n,v[i]); //往对应的线段树插点
  60. id[v[i]]=i;
  61. }
  62. int k=read();
  63. char ch[];
  64. while(k--)
  65. {
  66. scanf("%s",ch);
  67. x=read();y=read();
  68. if(ch[]=='Q')
  69. {
  70. int p=find(x);
  71. if(sum[root[p]]<y)
  72. {
  73. puts("-1");continue;//查询越界
  74. }
  75. int t=query(root[p],,n,y); //得到location
  76. printf("%d\n",id[t]);
  77. }
  78. else
  79. {
  80. int p=find(x),q=find(y);
  81. if(p!=q)
  82. {
  83. fa[p]=q;
  84. root[q]=merge(root[p],root[q]);
  85. }
  86. }
  87. }
  88. return ;
  89. }

权值线段树的理解更加深刻了

权值线段树的下标是数字本身,而存的是这个数出现的次数,也就是权值

一般权值线段树都是和动态开点捆绑在一起的

所谓动态开点,就是每个节点用的时候再开,可以去掉许多无用的节点

和主席树的区别,目前阶段的理解就是,主席树需要离散化,动态开点线段树不需要?

建n棵线段树,每一棵线段树维护[1,i]的数字出现情况

也就是当前数字范围内的数出现了多少次

然后前缀和查找就好了

可以这么说,动态开点的权值线段树的儿子之间没有耦合,可持久化权值线段树的儿子之间是耦合在一起的

虽然功能一样的,但是T和M会有差异

BZOJ2733:使用并查集维护连通性之后用线段树维护+线段树合并(动态开点)的更多相关文章

  1. CF731C Socks并查集(森林),连边,贪心,森林遍历方式,动态开点释放内存

    http://codeforces.com/problemset/problem/731/C 这个题的题意是..小明的妈妈给小明留下了n只袜子,给你一个大小为n的颜色序列c 代表第i只袜子的颜色,小明 ...

  2. bzoj2733 离线+并查集+主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 网上清一色的合并线段树题解,我又不会,只能自己胡来,没想到Rush过去了 永无乡包含 n 座 ...

  3. YYHS-猜数字(并查集/线段树维护)

    题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LY ...

  4. 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)

    最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...

  5. NOI2001 食物链【扩展域并查集】*

    NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  6. BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集

    题目链接:http://uoj.ac/problem/274 题意概述: 没什么好概述的......概述了题意就知道怎么做了......我懒嘛 分析: 就是用lct维护最大生成树. 然后如果去UOJ上 ...

  7. 浅谈并查集 By cellur925【内含题目食物链、银河英雄传说等】

    什么是并查集? 合并!查询!集合! 专业点说? 动态维护若干不重叠的和,支持合并查询的数据结构!(lyd老师说的) 数据结构特点:代表元.即为每个集合选择一个固定的元素,作为整个集合的代表,利用树形结 ...

  8. ZR并查集专题

    ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...

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

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

  10. CF109 C. Lucky Tree 并查集

    Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...

随机推荐

  1. wpa_supplicant与kernel交互

    wpa_supplicant与kernel交互的操作,一般需要先明确驱动接口,以及用户态和kernel态的接口函数,以此来进行调用操作.这里分为4个步骤讨论. 1.首先需要明确指定的驱动接口.因为有较 ...

  2. 2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算

    相关过程截图 截图为我负责的部分关于计算的测试 关键代码解释 根据代码中的部分解释,这部分代码实现了结果的整数和分数的输出,如果算出的结果为一个真分数,就输出真分数的形式,如果结果为整数,就输出整数形 ...

  3. 20145214 《Java程序设计》第2周学习总结

    20145214 <Java程序设计>第2周学习总结 教材学习内容总结 基本类型 整数:可分为short整数.int整数.long整数. 字节:即byte类型,可表示-128~127的整数 ...

  4. <Android>资源的访问,颜色、字符串、尺寸、XML、DRAWABLES资源分使用

    1.资源的访问 代码中使用Context的getResources()方法得到Resources对象,访问自己定义的资源R.资源文件类型.资源文件名称,访问系统定义的资源android.R. 资源文件 ...

  5. JDK源码分析 – ArrayList

    ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...

  6. Gradle sync failed: Failed to find Build Tools revision 26.0.2的解决办法

    说明在android studio中没有 build tools 的26.0.2的版本,你确认一下,是否是这样: 点击==>android studio的菜单栏中Tools==>andro ...

  7. 求助 delphi ADO组件的 CursorLocation属性设置为 clUseServer 用法 [问题点数:20分]

    我有个管理系统,所有ADOQUERY组件的 CursorLocation属性设置为 clUseClient,一直运行正常,我尝试全部设置为clUseServer, 系统不运行了,请大家帮忙. 我的做法 ...

  8. Bootstrap 导航条理解

    以下理论内容copy自Bootstrap中文网 (一个不错的bootstrap学习网站) 导航条 默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并 ...

  9. 第24天:js-函数变量声明提升

    一.函数声明1.自定义函数function fun1(){ alert("我是自定义函数");}fun2();//函数不调用,自己不执行2.直接量声明var fun2=functi ...

  10. CodeForces - 704C

    题目大意:给你一个逻辑表达式,然后让你计算表达式为真的取值情况数,表达式由一系列的 a 或者 a|b 亦或起来,每个变量最多出现两次(包括反变量) 嘴炮开始:每个变量最多出现两次,那么跟它相关联的变量 ...