TYVJ P1728 普通平衡树
P1728 普通平衡树
背景
描述
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
输入格式
输出格式
测试样例1
输入
8
1 20
1 30
3 20
4 2
2 10
5 25
6 -1
输出
2
20
20
20
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod
#define M 1000010
using namespace std;
LL read(){
LL nm=,oe=;char cw=getchar();
while(!isdigit(cw)) oe=cw=='-'?-oe:oe,cw=getchar();
while(isdigit(cw)) nm=nm*+(cw-''),cw=getchar();
return nm*oe;
}
LL n,m,l[M],r[M],sz[M],tp[M],p[M],num[M],cnt,T,ace,typ;
inline void pushup(LL x){sz[x]=sz[l[x]]+sz[r[x]]+num[x];}
void rotate(LL x){
if(x==ace) return;
LL top=tp[x];sz[x]=sz[top];
if(l[top]==x) sz[top]=sz[r[top]]+sz[r[x]]+num[top];
else sz[top]=sz[l[top]]+sz[l[x]]+num[top];
if(top==ace){ace=x,tp[top]=ace;}
else{
tp[x]=tp[top];
if(l[tp[top]]==top) l[tp[top]]=x,tp[top]=x;
else r[tp[top]]=x,tp[top]=x;
}
if(l[top]==x) l[top]=r[x],tp[r[x]]=top,r[x]=top;
else r[top]=l[x],tp[l[x]]=top,l[x]=top;
}
void splay(LL x){
while(ace!=x){
LL top=tp[x];
if(top==ace) rotate(x);
else if(l[l[tp[top]]]==x||r[r[tp[top]]]==x) rotate(top);
else rotate(x);
}
}
void insert(LL x){
if(ace==){ace=++cnt,p[ace]=x,sz[ace]=num[ace]=;return;}
LL k=ace,last=,sta=,CNT=;
while(true){
if(k==){
p[++cnt]=x,tp[cnt]=last,sz[cnt]=num[cnt]=;
if(sta==) r[last]=cnt;
else l[last]=cnt;
break;
}
last=k;
if(p[k]<x) k=r[k],sta=;
else if(p[k]>x) k=l[k],sta=;
else{num[k]++;break;}
}
while(true){
sz[last]++,CNT++;
if(last==ace) break;
last=tp[last];
}
splay(cnt);
}
LL find(LL x){
LL k=ace,CT=;
while(p[k]!=x&&k>){
if(p[k]>x) k=l[k];
else k=r[k];
CT++;
}
if(CT>=&&k>) splay(k);
return k;
}
LL gt(LL x,LL tpe){
LL k=find(x),rt1=-,rt2=;
if(k==){
for(LL t=ace;t>;){
if(p[t]>x) rt2=min(rt2,p[t]),t=l[t];
else rt1=max(rt1,p[t]),t=r[t];
}
return tpe==?rt1:rt2;
}
splay(k);
for(LL t=l[k];t!=;t=r[t]) rt1=max(rt1,p[t]);
for(LL t=r[k];t!=;t=l[t]) rt2=min(rt2,p[t]);
return tpe==?rt1:rt2;
}
LL ord(LL x){
LL k=find(x);
splay(k);
return sz[l[k]]+;
}
LL getnum(LL x){
LL k=ace,od=x;
while(sz[l[k]]+>od||sz[l[k]]+num[k]<od){
if(sz[l[k]]+>od) k=l[k];
else od-=sz[k]-sz[r[k]],k=r[k];
}
return k;
}
void del(LL x){
LL pos=find(x),last=;
if(num[pos]>){
num[pos]--,last=pos;
while(true){
sz[last]--;
if(last==ace) break;
last=tp[last];
}
return;
}
splay(pos),sz[pos]--;
if(l[pos]==&&r[pos]==){ace=;return;}
else if(l[pos]==) ace=r[pos];
else if(r[pos]==) ace=l[pos];
else{
LL ss=l[pos];
if(r[ss]==){
p[pos]=p[ss],num[pos]=num[ss];
tp[l[ss]]=tp[ss],l[tp[ss]]=l[ss];
return;
}
while(r[ss]>) ss=r[ss];
p[pos]=p[ss],num[pos]=num[ss];
tp[l[ss]]=tp[ss],r[tp[ss]]=l[ss];
for(LL i=l[ss];i!=ace;i=tp[i]) pushup(tp[i]);
}
}
int main(){
T=read();
while(T--){
typ=read(),m=read(),num[]=find(m);
if(typ==) insert(m);
else if(typ==) del(m);
else if(typ==) printf("%lld\n",ord(m));
else if(typ==) printf("%lld\n",p[getnum(m)]);
else printf("%lld\n",gt(m,typ-));
}
return ;
}
TYVJ P1728 普通平衡树的更多相关文章
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
随机推荐
- 安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决!
安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决! ...
- Tensorflow 初级教程(二)
一.Tensorflow 扩展功能 1.自动求导 2.子图的执行 3.计算图控制流 4.队列/容器 Tensorflow 自动求导 当计算tensor C关于tensor W的梯度时,会先寻找从W到C ...
- 关于js sort排序方法
sort() 方法用于对数组的元素进行排序. 语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函数. 当方法不带参数的时候,将按照字符编码顺序进行排序 ...
- htop的使用
htop是top的增强版本.官网地址: http://hisham.hm/htop/ 这网站比较...... 实验环境: [root@miyan ~]# cat /etc/redhat-release ...
- SVN代码merge
如何merge代码?建议用命令搞merge,客户端图形界面不是很给力.SVN 1.5以上版本,可以使用SVN的自动合并:将主干合并到分支:进入分支目录,执行命令: svn merge http://s ...
- sonarQube使用maven进行检查
1.在maven的中找到setting配置文件.在setting.xml中增加sonarqube配置.如下: <profiles> <profile> <id>so ...
- flex 组件重写 组件生命周期
AS方式重写组件常规步骤 1.如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins) 2.创建ActionScript类文件 ⑴从一个基类扩展,比如UIComponent或者其他 ...
- Render树、RenderObject与RenderLayer
Chapter: 呈现树的构建 1. 呈现树与CSS盒子模型千丝万缕的关系 2. 呈现树与DOM树的关系 3. 浏览器构建呈现树的流程 4. Firefox的规则树和样式上下文树 5. 规则树是如何解 ...
- LightOJ 1138 二分
1138 - Trailing Zeroes (III) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- WCF REST开启Cors 解决 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 405.
现象: 编写了REST接口: [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(UriTemp ...