题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3224
题意:维护以下操作:
(1)插入x;
(2)删除x(若有多个相同的数,只删除一个)
(3)查询x的排名(若有多个相同的数,输出最小的排名)
(4)查询排名为x的数
(5)求x的前驱(前驱定义为小于x,且最大的数)
(6)求x的后继(后继定义为大于x,且最小的数)
思路:主要用到使用树状数组计算第K位置元素。
struct node
{
int x,y;
node(){}
node(int _x,int _y)
{
x=_x;
y=_y;
}
void get()
{
RD(x,y);
}
int operator<(const node &a) const
{
return y<a.y;
}
};
node a[N],b[N];
int n,p[N],c[N],m,M;
void add(int x,int det)
{
while(x<=m)
{
c[x]+=det;
x+=x&-x;
}
}
int get(int x)
{
int ans=0;
while(x)
{
ans+=c[x];
x-=x&-x;
}
return ans;
}
int getKth(int k)
{
int ans=0,cnt=0,i;
for(i=20;i>=0;i--)
{
ans+=1<<i;
if(ans>M||cnt+c[ans]>=k) ans-=1<<i;
else cnt+=c[ans];
}
return ans+1;
}
void go()
{
int i,temp;
FOR1(i,n)
{
if(a[i].x==1) add(a[i].y,1);
else if(a[i].x==2) add(a[i].y,-1);
else if(a[i].x==3) PR(get(a[i].y-1)+1);
else if(a[i].x==4) PR(b[p[getKth(a[i].y)]].y);
else if(a[i].x==5)
{
temp=get(a[i].y-1);
PR(b[p[getKth(temp)]].y);
}
else
{
temp=get(a[i].y)+1;
PR(b[p[getKth(temp)]].y);
}
}
}
int main()
{
RD(n);
int i;
FOR1(i,n)
{
a[i].get();
if(a[i].x!=4) b[++m]=node(i,a[i].y);
}
sort(b+1,b+m+1); b[0].y=19891101;
FOR1(i,m)
{
if(b[i].y==b[i-1].y) a[b[i].x].y=M;
else a[b[i].x].y=++M,p[M]=i;
}
go();
}
BZOJ 3224 普通平衡树(树状数组)的更多相关文章
-
BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
-
BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))
题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...
-
Bzoj 2789: [Poi2012]Letters 树状数组,逆序对
2789: [Poi2012]Letters Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 278 Solved: 185[Submit][Stat ...
-
BZOJ 4361 isn | DP 树状数组
链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...
-
【bzoj3224】【Tyvj 1728】 普通平衡树 树状数组
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入$x$数2. 删除$x$数(若有多个相同的数,因只删除一个)3. 查询$x$数的排名(若有多个相同的数,因输出最小 ...
-
bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
-
BZOJ 2727 双十字(树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2727 题意: 思路:思路来自这里.首先对于每个位置(i,j)用C[i][j]表示该位置同 ...
-
BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
-
luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
-
BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
随机推荐
-
Javascript中DOM的练习
第一个题:html计时器 方法一: <body onLoad="show()" > <div id="b"></div> & ...
-
再次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
-
php里的declare用法
function tick_handler () { echo "tick_handler() called<br>" ; } function tick_handle ...
-
php笔记01:php基本语法格式
1. <?php ....... ?> 2. <script laugnage="php"> ....... </script> 3. < ...
-
Qt调用word 例子
Qt调用word 例子 Getting Microsoft Word Object to SaveAs #include <QtGui> #include <QAxObject> ...
-
java环境变量最佳配置
1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7. ...
-
python闭包和延迟绑定
一.什么是闭包: 1.函数内定义函数. 2.外函数的返回时内函数的引用. 3.内函数使用外函数的局部变量(至少一个). 1 def outfunc(): 2 for num in range(4): ...
-
Segment 李超线段树
题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...
-
https://*.com/questions/40949967/running-storm-from-intellij-nimbus-error
https://*.com/questions/40949967/running-storm-from-intellij-nimbus-error 0down votefavo ...
-
fpm制作rpm包
一.前言 在企业中我们有事安装软件包.部分都是源码安装,如nginx安装路径都已经固化了,但实际业务中,我们都是把软件包安装到固定目录下,不满足需要,这是其一.其二,编译安装很耗时,比如mysql,特 ...