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

题意就是给你两个操作

一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第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. wpa_supplicant下行接口浅析

    wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令. 以下摘自http://blog.csdn.net/fxfzz/article/details/6 ...

  2. UVALive - 6868 Facility Locations 想法题

    题目链接: http://acm.hust.edu.cn/vjudge/problem/88634 Facility Locations Time Limit: 3000MS 题意 给你一个m*n的矩 ...

  3. Java常用类之String

    String 类: 1. java.lang.String 类代表不可变的字符序列:  2. “XXX” 为该类的一个对象: 3. String 类的常用构造方法: ① String(String o ...

  4. python中装饰器的原理以及实现,

    python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...

  5. 系统管理员需知:25个Linux服务器安全技巧(转)

    来源:51CTO 作者:51CTO       大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题).Linux默认确实有内置的安全模型.你需要打开它并且对其进行定制,这样才能 ...

  6. JQuery 学习笔记--02

    JS 中的 window.onload() 方法与 Jquery 中的 $(document).read(function( ){  }) 的区别 : 加载时机不一样, window.onload() ...

  7. Java notify的使用

    半路出家学习java, 花了几分钟简单看了.在早上那个例子上稍微改了下, notify 对象上必须使用 synchronized 我的理解是在java synchronized只是个线程同步标志,但是 ...

  8. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  9. 【bzoj1700】Problem Solving 解题 dp

    题目描述 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一 ...

  10. Linux查看PCIe版本及速率

    Linux查看PCIe版本及速率 PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格 查看主板上的PCI插槽 # dmidecode | grep --color "PCI&q ...