cogs 1829. [Tyvj 1728]普通平衡树 权值线段树
1829. [Tyvj 1728]普通平衡树
★★★ 输入文件:phs.in 输出文件:phs.out 简单对比
时间限制:1 s 内存限制:1000 MB
【题目描述】
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
【输入格式】
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)
【输出格式】
对于操作3,4,5,6每行输出一个数,表示对应答案
【样例输入】
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
【样例输出】
106465
84185
492737
【提示】
#include<bits/stdc++.h>
#define maxn 100005
#define maxSIZE maxn*20
#define INF 1e7
#define mid (l+r>>1)
using namespace std;
int sum[maxSIZE],ls[maxSIZE],rs[maxSIZE];
int RT,cnt;//动态开点 不会炸内存
void Add(int &rt,int l,int r,int pos,int qx)
{
if(!rt)
rt=++cnt;
if(l==r)
{
sum[rt]+=qx;
return;
}
if(pos<=mid)
Add(ls[rt],l,mid,pos,qx);
else
Add(rs[rt],mid+,r,pos,qx);
sum[rt]=sum[ls[rt]]+sum[rs[rt]];
return;
}
int Sum(int rt,int l,int r,int s,int t)
{
if(!rt||s>r||t<l)
return ;
if(s<=l&&r<=t)
return sum[rt];
return Sum(ls[rt],l,mid,s,t)+Sum(rs[rt],mid+,r,s,t);
}
int Get(int rt,int l,int r,int rank)
{
if(l==r)//保证合法 不用判rt
{
return l;
}
if(rank<=sum[ls[rt]])
return Get(ls[rt],l,mid,rank);
else
return Get(rs[rt],mid+,r,rank-sum[ls[rt]]);
}
int main()
{
freopen("phs.in","r",stdin);
freopen("phs.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==)
{
Add(RT,-INF,INF,x,);
}
if(opt==)
{
Add(RT,-INF,INF,x,-);
}
if(opt==)
{
printf("%d\n",Sum(RT,-INF,INF,-INF,x-)+);
}
if(opt==)
{
printf("%d\n",Get(RT,-INF,INF,x));
}
if(opt==)
{
int tmp=Sum(RT,-INF,INF,-INF,x-)+;//rank x
printf("%d\n",Get(RT,-INF,INF,tmp-));
}
if(opt==)
{
int tmp=Sum(RT,-INF,INF,-INF,x)+;//rank x+1
printf("%d\n",Get(RT,-INF,INF,tmp));
}
} return ;
}
我的代码
那么这一大堆东西到底是什么意思呢?
权值线段树 就是线段树里不是下标 是值域
然后我们这里有几个操作
操作一 就是插入操作嘛
就把那个数值的个数+1
操作二 删除操作
一样的 就是数值的个数-1
操作三 查询x数的排名
就是查找值域范围从-INF到x-1内一共有多少个数 再加上一个1就行了
操作四 查询排名为x的数是什么
可以写一个Get函数来进行一下二分

这一段到底什么意思
就是说如果在左儿子里 就往左走
要是在右儿子里 不仅要往右走 还有要 rank-左边一共有多少个数 因为左边的那些数都比当给钱要查找的这个排名是rank的数要小
操作五 求小于x的最大的数
这个操作吗 就是查找x个排名-1的数就行了
操作六 求大于x的最小的数
我们可以加一个数
求一下x+1的排名 在查找一下那个排名的位置的数值是什么
听起来非常玄学 就是我们可以加一个x+1这样一个虚拟的数(存不存在不要紧) 只是先查出来它的排名而已
最后一点非常重要 要动态开点 不要用p*2 和p*2+1的那种存储方式 会炸内存的
一共只需要开log(len)*n的数组大小就行了
len就是值域总范围 在这一道题中是2e7
cogs 1829. [Tyvj 1728]普通平衡树 权值线段树的更多相关文章
- [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...
- [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]
题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...
- BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】
一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- BZOJ 4777 Usaco2017 Open Switch Grass Kruskal+替罪羊树+权值线段树
这道题首先可以看出答案一定是一条边,而且答案一定在最小生成树上,那么我们就可以在这个最小生成树上维护他与异色儿子的边最小值,所以我们就可以已通过Kruskal和一棵平衡树来解决,时间复杂度是O(n*l ...
随机推荐
- dotnet 设计规范 · 抽象定义
严格来说,只有一个类被其他的类继承,那么这个类就是基类.在很多时候,基类的定义是提供足够的抽象和通用方法和属性.默认实现.在继承关系中,基类定义在上层抽象和底层自定义之间. 他们充当抽象实现的实现帮助 ...
- HTML DOM clearInterval() 方法
定义和用法 clearInterval() 方法可取消由 setInterval() 设置的 timeout. clearInterval() 方法的参数必须是由 setInterval() 返回的 ...
- laydate type=time/datetime/date 开始时间和结束时间的输入限制
最近项目中使用了laydate插件,需要限制开始时间和结束时间的输入 1.type=date 要求:周期开始时间和周期结束时间以天为单位,结束时间不能早于开始时间,可以是同一天. 周期开始时间:< ...
- html设置<input type="text">内的内容自动为大写
添加css样式:text-transform:uppercase;可以实现自动转换为大写样式. 但是input 的value还是小写的,因为它是CSS样式. <input type=" ...
- H3C 单路径网络中环路产生过程(1)
- 【git】Git回退代码到指定版本
1. 查看所有的历史版本,获取你git的某个历史版本的id, git log2. 回退本地代码库:git reset --hard ID3. 推送到远程服务器:git push -f -u origi ...
- 11-28\enum
1.创建一个枚举对象,对象中4个属性video视频.book书----(这2个属性可以用数字表示). 2.创建一个class对象,对象中有2个属性,一个是id属性(自己设置),第二个属性是type类型 ...
- Linux 创建和销毁 urb
struct urb 结构在驱动中必须不被静态创建, 或者在另一个结构中, 因为这可能破坏 USB 核心给 urb 使用的引用计数方法. 它必须使用对 usb_alloc_urb 函数的调用而被创 建 ...
- 布尔&list与条件循环语句与trutle
布尔值与空值 布尔值: 一个布尔值只有True.False两种值 空值: 是python里一个特殊的值,用None表示.None不能理解为0.因为0是有意义的,而None是一个特殊值. list(列表 ...
- poj1080 - Human Gene Functions (dp)
题面 It is well known that a human gene can be considered as a sequence, consisting of four nucleotide ...