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 ...
随机推荐
- python is == 的区别, 编码与解码.深浅拷贝
一. is == 的区别 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址 is 比较的是地址 编码回顾 除了了ASCII码以外, 其他信息不能直接转换 编码和解码的时 ...
- double,long double及各变量数组内存开销
IEEE754浮点数的表示方法.C语言里对float类型数据的表示范围为-3.4*10^38-+3.4*10^38.double为-1.7*10^-308~1.7*10^308,long double ...
- iptables的用例
iptables书写思路顺序 1.协议 icmp 2.哪个功能和目标:过滤,拒绝 3.数据包流向:外到内 4.哪个链适合:越早越好,INPUT 5.源地址和目标地址 练习1.禁止某些主机或网络访问本机 ...
- Python菜鸟之路:Python基础-Socket编程-2
在上节socket编程中,我们介绍了一些TCP/IP方面的必备知识,以及如何通过Python实现一个简单的socket服务端和客户端,并用它来解决“粘包”的问题.本章介绍网络编程中的几个概念:多线程. ...
- 用VirtualBox和vagrant在win7×64上搭建ruby on rails 开发环境
下载准备 1.vagrant 官方 WINDOWS Universal (32 and 64-bit) http://www.vagrantup.com/downloads.html 2.Virtu ...
- Django继承HTML模板
Django在渲染模板的过程中可以实现模板样式的继承,以减少重复的代码 1.extend继承 模板.html: 模板内容 {{% block name1 %}} {{% enfblock %}} #n ...
- python学习-1-列表,元组,字典,集合,文件操作
1. 列表.元组操作 names = ['Alex',"Tenglan",'Eric'] >>> names[0] >>> names[2] & ...
- STM32L0 HAL库 IO读写功能
开发环境使用 MDK5.16a + CUBEMX生成代码 开发板使用:NUCLEO-L053R8 核心芯片:STM32L053R8 今天主要学习了下最基础的IO的读写,IO使用 PA5 LED输出 ...
- CSS选择器(一)
一.CSS 元素选择器 最常见的 CSS 选择器是元素选择器.换句话说,文档的元素就是最基本的选择器. 如果设置 HTML 的样式,选择器通常将是某个 HTML 元素,比如 p.h1.em.a,甚至可 ...
- eclipse中,项目无法在tomcat中发布(project facet java version 1.7 is not supported)
在tomcat中发布项目时无法添加项目,错误信息:project facet java version 1.7 is not supported,如下图 这是由于你的tomcat的jdk版本低于你项目 ...