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 ...
随机推荐
- POJ 2187 Beauty Contest(凸包+旋转卡壳)
Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, ea ...
- 软工2017第四周作业结对编程——个人psp
29.22 --9.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间 结束时间 中断时间 ...
- c# 有无符号值进一步了解
1.编写过程中用到了short类型(有符号型,值范围含负值).两个正数之和得负. 改为int或unsigned short 均可. 2.注意,short型(-32768,32767)举例:做自加运算, ...
- C++ Mooc学习
# C++远征篇之起航 1.IDE搭建,现在大部分同学都使用devC,devC的debug调试功能特别好用,可以跟踪变量.省去了在中间插入一些输出语句来输出中间变量的麻烦. 2.using names ...
- ManagementClass("Win32_Share")之共享目录
public class ShareFolder { private static readonly Dictionary<uint, string> ReturnDetails = ne ...
- Pandas速查手册中文版(转)
关键缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 同时我们需要做如下的引入: import pandas as pd 导入数据 pd.read_ ...
- [C/C++] C++抽象类
转自:http://www.cnblogs.com/dongsheng/p/3343939.html 一.纯虚函数定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己 ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
- 网页添加提示音,用setInterval
如果一条数据通过审核了,修改数据库中一个值,用户怎么异步动态知道自己的记录通过审核了呢,我是通过音乐和提示的方式. 网页中添加如下代码: <style> #notify { positio ...
- windows 2008 iis7 上传大文件限制的真正解决办法
以前做了一个网站 ,当时本机测试时上传文件大小没有问题,上G也应该可以,可是放在服务器后只能上传小于30M以下文件,当时基本需要也基本在30M以下,就没有管,后在网上发现原来是window2008本身 ...