您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
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相关推荐

  1. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  2. 树套树 ----- 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],我们要减去[ ...

  3. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  4. codevs1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 给定一个序列a1,a2,-,an,如 ...

  5. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

  6. HDU-5249 KPI(STL or 权值线段树)

    题目链接 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请 ...

  7. Governing sand(权值线段树/主席树)

    链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言13107 ...

  8. 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 ...

  9. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

  10. HDU1394(权值线段树)

    HDU1394(权值线段树) 题意: 给定一个0到n-1的数字组成的序列,可以将序列进行左移任意次,求所能组成序列的逆序对的最小值 题解: 利用权值线段树,我们先求出当前序列所能组成的逆序对, 然后依 ...

最新文章

  1. 并发执行变成串行_一篇讲透如何理解数据库并发控制(纯干货)
  2. 根据类名与字段名称取值(可用于循环取实体所有值非常好用)
  3. Jmeter 压力测试中关于 Http 的那些事儿
  4. PHP 端口号 是否 被占用 以及 解决方法
  5. 网络品牌推广之标签的使用注意事项
  6. 在enable mmu之前可以使用mmu了
  7. 综合布线中所需要的的带宽和数据速率
  8. 30 校准_校准or质控,傻傻分不清楚
  9. 一文带你解读Volcano架构设计与原理
  10. mysql简单增删改查(CRUD)
  11. javamail 超时_为什么JavaMail连接超时太长
  12. Unity面试题精选(2)
  13. 内网渗透中SSh的巧用
  14. ArcGIS Server大数据量地图服务影像缓存建立方法初探
  15. Android app使用TextToSpeech实现文字转换语音
  16. 计算机常用英语大全 (中英文对照)
  17. 一小时教会你用JAVA制作超级玛丽小游戏
  18. 信息收集--子域名查询
  19. 什么是android刷机包,刷机包是什么?ROM刷机包是什么意思?
  20. Emacs查词典: 第三部分 Google Dictionary Translation

热门文章

  1. python里的拆包、引用、递归与匿名函数
  2. 《嵌入式设备驱动开发精解》——1.1 本书内容的组织
  3. SQL Server BI Step by Step SSIS 5 --- 通过Email发送查询结果
  4. 获取客户端登录ip地址
  5. [工具开发] 移动梦网短信发送客户端
  6. java中list、set和map 实例
  7. Oracle 10g中UNDO数据的作用及UNDO表空间的操作详解
  8. 细说分布式Redis架构设计和那些踩过的坑
  9. 90 岁程序员,他的压缩算法改变了世界!
  10. HTTP2还没用上,HTTP3就出来了