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

【提示】

1.n的数据范围:n<=100000
2.每个数的数据范围:[-1e7,1e7]
 
 
权值线段树
动态开点
先贴一下代码吧
#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]普通平衡树 权值线段树的更多相关文章

  1. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  2. [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]

    题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...

  3. BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】

    一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...

  4. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  5. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)

    带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...

  6. HDU - 2665 Kth number 主席树/可持久化权值线段树

    题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...

  7. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  8. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  9. BZOJ 4777 Usaco2017 Open Switch Grass Kruskal+替罪羊树+权值线段树

    这道题首先可以看出答案一定是一条边,而且答案一定在最小生成树上,那么我们就可以在这个最小生成树上维护他与异色儿子的边最小值,所以我们就可以已通过Kruskal和一棵平衡树来解决,时间复杂度是O(n*l ...

随机推荐

  1. java数组简介

    数组(Array)是Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合,目的是用来一次存储多个数据.数组是程序中实现很多算法的基础,可以在一定程度上简化代码的书写. 备注: 数组 ...

  2. python3快捷键

    原文:https://blog.csdn.net/pipisorry/article/details/39909057 PyCharm3.0默认快捷键(翻译的) PyCharm Default Key ...

  3. dotnet core 添加 SublimeText 编译插件

    因为 SublimeText 有很多插件都是使用 Py 写的,而我想使用 dotnet core 给 SublimeText 写一个编译插件,也就是在我使用 Markdown 的时候可以点击编译,将 ...

  4. 解析PHP跳出循环的方法以及continue、break、exit的区别介绍

    本篇文章是对PHP跳出循环的方法以及continue.break.exit的区别进行了详细的分析介绍,需要的朋友参考下   PHP中的循环结构大致有for循环,while循环,do{} while 循 ...

  5. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted)

    问题现象 原因 1.初次看报错日志内容,定义权限为问题,后来查资料才知道是缓存问题. 解决方法 1.简单直接 直接删除 npmrc文件 tips: 不是nodejs安装目录npm模块下的那个npmrc ...

  6. 21个项目玩转深度学习:基于TensorFlow的实践详解02—CIFAR10图像识别

    cifar10数据集 CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集.一共包含 10 个类别的 ...

  7. 2019-8-6-在-Gitlab-开启-MatterMost-机器人

    title author date CreateTime categories 在 Gitlab 开启 MatterMost 机器人 lindexi 2019-8-6 19:42:1 +0800 20 ...

  8. 【HTML/CSS】置换元素

    置换元素: 一个内容不受CSS视觉格式化模型控制,CSS渲染模型并不考虑对此内容的渲染,且元素本身一般拥有固有尺寸(宽度,高度,宽高比)的元素,被称之为置换元素. 行内级置换和非置换元素的宽度定义 对 ...

  9. 【47.40%】【BZOJ 1875】[SDOI2009]HH去散步

    Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1363  Solved: 646 [Submit][Status][Discuss] Descript ...

  10. sqlyog提示:没有执行查询。请在 SQL 窗口中输入查询或将光标放在一个查询上。

    以下内容纯属猜测: sqlyog 在执行输入的sql语句时,对已经执行过的语句,是不会再执行的,所以出现这个问题,很可能是sql语句没有修改,就试图执行第二遍.