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 集合类 & 容器

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...

  2. 4-3 xpath的用法

  3. LCA (最近公共祖先)倍增做法 —— O(nlogn)预处理 O(logn)(在线)查询

    pa[a][j] 表示 a 结点的 2^j倍祖先(j = 0时 为直接父亲,j = 1时为父亲的父亲……) 1.首先预处理出所有结点的深度值dep和父亲结点 void dfs(int u, int f ...

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

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

  5. 解决 el-autocomplete 不显示及没数据时闪一下的问题

    项目中用到了elementUI中的远程搜索即 el-autocomplete 组件,估计首次使用的都会遇到一些小问题,只要你能认真看完并且耐心理解,保证能帮到你,效果图如下: 组件代码: <el ...

  6. CSS兼容性问题的解决方式(更新中···)

    1.清除浮动的兼容性(低版本的浏览器不兼容问题) .clearfix:after{ content:""; clear:both; display:block; visibilit ...

  7. UVA - 10480 Sabotage (Dinic)

    The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebel-l ...

  8. CodeForces - 1162E Thanos Nim (博弈论)

    Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number ...

  9. 为何D3D11的几个矩阵需要转置?

    在学习D3D11的时候遇到一个问题,事情是这样的: D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Re ...

  10. codeforces 1167B Lost Numbers

    传送门:https://codeforces.com/contest/1167/problem/B 题意: 交互题:现在你有6个数4, 8, 15, 16, 23, 42组成的某种组合,你可以询问系统 ...