BZOJ2733:使用并查集维护连通性之后用线段树维护+线段树合并(动态开点)
可以说是线段树合并的裸题吧
题意就是给你两个操作
一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第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:使用并查集维护连通性之后用线段树维护+线段树合并(动态开点)的更多相关文章
- CF731C Socks并查集(森林),连边,贪心,森林遍历方式,动态开点释放内存
http://codeforces.com/problemset/problem/731/C 这个题的题意是..小明的妈妈给小明留下了n只袜子,给你一个大小为n的颜色序列c 代表第i只袜子的颜色,小明 ...
- bzoj2733 离线+并查集+主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2733 网上清一色的合并线段树题解,我又不会,只能自己胡来,没想到Rush过去了 永无乡包含 n 座 ...
- YYHS-猜数字(并查集/线段树维护)
题目描述 LYK在玩猜数字游戏. 总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi. 我们总能构造出一种方案使得LY ...
- 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)
最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...
- NOI2001 食物链【扩展域并查集】*
NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...
- BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
题目链接:http://uoj.ac/problem/274 题意概述: 没什么好概述的......概述了题意就知道怎么做了......我懒嘛 分析: 就是用lct维护最大生成树. 然后如果去UOJ上 ...
- 浅谈并查集 By cellur925【内含题目食物链、银河英雄传说等】
什么是并查集? 合并!查询!集合! 专业点说? 动态维护若干不重叠的和,支持合并查询的数据结构!(lyd老师说的) 数据结构特点:代表元.即为每个集合选择一个固定的元素,作为整个集合的代表,利用树形结 ...
- ZR并查集专题
ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- CF109 C. Lucky Tree 并查集
Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...
随机推荐
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
- mysql 复杂查询
1.同一个表下多次查询: sql语句: select b.* ,(select name from exh_common.medicine_type a where b.p_id = a.id) as ...
- C++多态实现与继承
面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中, 封装可以隐藏实现细节,使得代码模块化: 继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用: 而多态则是为了 ...
- Unity3d学习日记(一)
闲来无事开始自学unity3d,发现还挺容易入门的,添加资源文件以及用c#编写脚本都很方便. 前面在Unity官方教程上自学了一段时间,跟着教程写了个space_shooter的小游戏,虽然游 ...
- CEntOS6.5从启动界面直接进入命令行界面
ctrl + alt + F1 ctrl + alt + F2 ctrl + alt + F3 ctrl + alt + F4 ctrl + alt + F5 ctrl + alt + F6 同时按下 ...
- 【Linux】- netstat 命令
Linux netstat命令用于显示网络状态.利用netstat指令可让你得知整个Linux系统的网络情况. 语法 netstat [-acCeFghilMnNoprstuvVwx][-A<网 ...
- 【Docker 命令】- pull命令
docker pull : 从镜像仓库中拉取或者更新指定镜像 语法 docker pull [OPTIONS] NAME[:TAG|@DIGEST] OPTIONS说明: -a :拉取所有 tagge ...
- c++源文件到可执行文件的过程
1.预处理(preprocessor):对#pragma.#include.#define.#ifdef/#endif.#ifndef/#endif,inline内联函数等进行处理 2.编译(comp ...
- Lucene笔记一
Lucene就是一个全文检索的工具,建立索引用的,类似于新华字典的目录 这里使用的是lucene-4.4.0版本,入门代码所需jar包如下图所示(解压lucene-4.4.0后的目录): 入门代码: ...
- BZOJ 1406 密码箱(数论)
很简洁的题目.求出x^2%n=1的所有x<=n的值. n<=2e9. 直接枚举x一定是超时的. 看看能不能化成有性质的式子. 有 (x+1)(x-1)%n==0,设n=a*b,那么一定有x ...