权值线段树BZOJ3224
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
#include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct Data {int v,p; }t[N]; bool cmp(const Data &a,const Data &b) {return a.v<b.v; } int T[N<<2],op[N],a[N],n,ma[N],e; void Update(int p,int v,int rt,int l,int r)//插入删除 {T[rt]+=v;if(l==r) return;int m=(l+r>>1);if(p<=m) Update(p,v,rt<<1,l,m);else Update(p,v,rt<<1|1,m+1,r); } int Kth(int K,int rt,int l,int r)//K小值 {if(l==r) return l;int m=(l+r>>1);if(T[rt<<1]>=K) return Kth(K,rt<<1,l,m);return Kth(K-T[rt<<1],rt<<1|1,m+1,r); } int Rank(int p,int rt,int l,int r)//排名 {if(r<p) return T[rt];int m=(l+r>>1),res=0;res+=Rank(p,rt<<1,l,m);if(m<p-1) res+=Rank(p,rt<<1|1,m+1,r);return res; } int Findp(int rt,int l,int r) {if(l==r) return l;int m=(l+r>>1);if(T[rt<<1|1]) return Findp(rt<<1|1,m+1,r);return Findp(rt<<1,l,m); } int Pre(int p,int rt,int l,int r) {if(r<p){if(T[rt]) return Findp(rt,l,r);return 0;}int m=(l+r>>1),Re;if(m<p-1 && T[rt<<1|1] && (Re=Pre(p,rt<<1|1,m+1,r))) return Re;return Pre(p,rt<<1,l,m); } int Findn(int rt,int l,int r) {if(l==r) return l;int m=(l+r>>1);if(T[rt<<1]) return Findn(rt<<1,l,m);return Findn(rt<<1|1,m+1,r); } int Nex(int p,int rt,int l,int r) {if(p<l){if(T[rt]) return Findn(rt,l,r);return 0;}int m=(l+r>>1),Re;if(p<m && T[rt<<1] && (Re=Nex(p,rt<<1,l,m))) return Re;return Nex(p,rt<<1|1,m+1,r); } int main() { // freopen("bzoj3224.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d%d",&op[i],&t[i].v);t[i].p=i;}sort(t+1,t+1+n,cmp);ma[a[t[1].p]=++e]=t[1].v;for(int i=2;i<=n;i++){if(t[i].v!=t[i-1].v) ++e;ma[a[t[i].p]=e]=t[i].v;}for(int i=1;i<=n;i++){if(op[i]==1) Update(a[i],1,1,1,e);else if(op[i]==2) Update(a[i],-1,1,1,e);else if(op[i]==3) printf("%d\n",Rank(a[i],1,1,e)+1);else if(op[i]==4) printf("%d\n",ma[Kth(ma[a[i]],1,1,e)]);else if(op[i]==5) printf("%d\n",ma[Pre(a[i],1,1,e)]);else printf("%d\n",ma[Nex(a[i],1,1,e)]);}return 0; }
转载于:https://www.cnblogs.com/--lr/p/9791406.html
权值线段树BZOJ3224相关推荐
- 【bzoj2770】YY的Treap 权值线段树
题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...
- 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)
解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...
- 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax为yyy 解题思路: 首先我们知道权值线段树是 ...
- codevs1688 求逆序对(权值线段树)
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,-,an,如 ...
- 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...
- HDU-5249 KPI(STL or 权值线段树)
题目链接 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请 ...
- Governing sand(权值线段树/主席树)
链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言13107 ...
- Minimum Inversion Number HDU - 1394(权值线段树/树状数组)
The inversion number of a given number sequence a1, a2, -, an is the number of pairs (ai, aj) that s ...
- 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)
之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...
- HDU1394(权值线段树)
HDU1394(权值线段树) 题意: 给定一个0到n-1的数字组成的序列,可以将序列进行左移任意次,求所能组成序列的逆序对的最小值 题解: 利用权值线段树,我们先求出当前序列所能组成的逆序对, 然后依 ...
最新文章
- 并发执行变成串行_一篇讲透如何理解数据库并发控制(纯干货)
- 根据类名与字段名称取值(可用于循环取实体所有值非常好用)
- Jmeter 压力测试中关于 Http 的那些事儿
- PHP 端口号 是否 被占用 以及 解决方法
- 网络品牌推广之标签的使用注意事项
- 在enable mmu之前可以使用mmu了
- 综合布线中所需要的的带宽和数据速率
- 30 校准_校准or质控,傻傻分不清楚
- 一文带你解读Volcano架构设计与原理
- mysql简单增删改查(CRUD)
- javamail 超时_为什么JavaMail连接超时太长
- Unity面试题精选(2)
- 内网渗透中SSh的巧用
- ArcGIS Server大数据量地图服务影像缓存建立方法初探
- Android app使用TextToSpeech实现文字转换语音
- 计算机常用英语大全 (中英文对照)
- 一小时教会你用JAVA制作超级玛丽小游戏
- 信息收集--子域名查询
- 什么是android刷机包,刷机包是什么?ROM刷机包是什么意思?
- Emacs查词典: 第三部分 Google Dictionary Translation