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

题意就是给你两个操作

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

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

 #include<cstdio>
const int maxn=;
int n,m,sz;
int v[maxn],id[maxn],fa[maxn],root[maxn];
int lch[],rch[],sum[];
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void insert(int &k,int l,int r,int val)
{
if(k==) k=++sz;
if(l==r)
{
sum[k]=;return;
}
int mid=(l+r)>>;
if(val<=mid) insert(lch[k],l,mid,val);
else insert(rch[k],mid+,r,val);
sum[k]=sum[lch[k]]+sum[rch[k]];
}
int query(int k,int l,int r,int rank)
{
if(l==r) return l;
int mid=(l+r)>>;
if(sum[lch[k]]>=rank) return query(lch[k],l,mid,rank);
else return query(rch[k],mid+,r,rank-sum[lch[k]]);
}
int merge(int x,int y)
{
if(x==) return y;
if(y==) return x;
lch[x]=merge(lch[x],lch[y]);
rch[x]=merge(rch[x],rch[y]);
sum[x]=sum[lch[x]]+sum[rch[x]];
return x;
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++) v[i]=read();
for(int i=;i<=n;i++) fa[i]=i;
int x,y;
for(int i=;i<=m;i++)
{
x=read(),y=read();
int p=find(x),q=find(y);
fa[p]=q;
}
for(int i=;i<=n;i++)
{
insert(root[find(i)],,n,v[i]); //往对应的线段树插点
id[v[i]]=i;
}
int k=read();
char ch[];
while(k--)
{
scanf("%s",ch);
x=read();y=read();
if(ch[]=='Q')
{
int p=find(x);
if(sum[root[p]]<y)
{
puts("-1");continue;//查询越界
}
int t=query(root[p],,n,y); //得到location
printf("%d\n",id[t]);
}
else
{
int p=find(x),q=find(y);
if(p!=q)
{
fa[p]=q;
root[q]=merge(root[p],root[q]);
}
}
}
return ;
}

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

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

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

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

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

建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. Python3 循环表达式

    一 While循环 基本循环 while 条件: 执行内容 #循环体 ... #循环体 ... #循环体 # 若条件为真,执行循环体内容 # 若条件为假,不执行循环体内容 实例1(Python 3.0 ...

  2. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  3. Line belt(三分镶嵌)

    In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's spee ...

  4. 【android】实现手指滑动来切换activity(转)

    http://code.eoe.cn/115 1.jpg外部引用 原始文档 MainActivity.java外部引用 原始文档 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  5. <Android>tab选项卡

    1.继承TabActivity实现 a)         在布局文件中使用FrameLayout列出Tab组件及Tab中的内容组件 b)        Activity要继承TabActivity c ...

  6. MongoDb Driver For Net

    由于mongodb开源github提供的net驱动都比较新,从2.3及以上版本都是netcore系列了,netframework至少都是4.6以上,且提供的dll并没有签名, 这就产生了一些问题 1 ...

  7. Java设计

    重构前 CustomDataChar | getConnection()findCustomers()createChar()displayChar() 重构后 CustomDataChar | da ...

  8. Maven pom 文件解释

    1 - 什么是构建? 我们都知道,写完代码之后需要进行编译和运行,以笔者自身为例,使用 Eclipse 写完代码,需要进行编译,再生成 war 包,以便部署到 Tomcat. 在编写 Java 代码的 ...

  9. VisualVM使用方法

    VisualVM 简介 VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序( ...

  10. BZOJ4565 HAOI2016字符合并(区间dp+状压dp)

    设f[i][j][k]为将i~j的字符最终合并成k的答案.转移时只考虑最后一个字符是由哪段后缀合成的.如果最后合成为一个字符特殊转移一下. 复杂度看起来是O(n32k),实际常数极小达到O(玄学). ...