P1728 普通平衡树

时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

此为平衡树系列第一道:普通平衡树

描述

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

输入格式

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

输出格式

对于操作3,4,5,6每行输出一个数,表示对应答案

测试样例1

输入

8

1 10 
1 20 
1 30 
3 20 
4 2 
2 10 
5 25 
6 -1

输出


20 
20 
20

 
splay裸体,无聊随便打一打,多练练手吧。
#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 普通平衡树的更多相关文章

  1. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  2. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  3. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  4. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

  5. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  6. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  7. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  8. BZOJ 3224: Tyvj 1728 普通平衡树 vector

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  9. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5354  Solved: 2196[Submit][Sta ...

随机推荐

  1. 转载:Python 包管理工具解惑

    Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...

  2. PHP中foreach用法详细讲解

    1.foreach是什么? foreach是PHP的一种语法结构,其实就是一个工具,(工具:就是工作的时候用到的器具),那么在程序开发过程中,为了达到程序效果,就用到了foreach. 2.如何用? ...

  3. python语言特性-------python2.7教程学习【廖雪峰版】(一)

    开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活.  2.Python是一种相当高级的语言. ...

  4. linux字符集查看与设置

    linux字符集查看与设置 命令:locale -a   查看本地的字符集        locale -m 查看所有支持的字符集   查看当前默认设置   echo $LANG   记录系统默认使用 ...

  5. android菜鸟学习笔记18----Android数据存储(二)SharedPreferences

    数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...

  6. Asp.Net mvc4 项目 在vs中调试正常 在IIS发布后连接oracle数据库时提示数据库连接关闭

    解决办法: 1.打开iis,找到发布的程序 2.右键单击“TAKANAPP” 从右键菜单选择“管理应用程序”--“高级设置....” 在打开的高级设置  面板 查看对应的应用程序池 名称 3.设置应用 ...

  7. [note]树链剖分

    树链剖分https://www.luogu.org/problemnew/show/P3384 概念 树链剖分,是一种将树剖分成多条不相交的链的算法,并通过其他的数据结构来维护这些链上的信息. 最简单 ...

  8. IDEA 配置Tomcat 跑Jeecg项目

    最近搞了个国人开发的开源项目,还不错,记录一下踩过得坑; 首先项目开源地址 下载就可以; 准备工作作者以介绍,不再详述; 1:我使用的IDEA作为开发工具- 首先导入pom.xml,下载依赖包(此过程 ...

  9. angularjs 中的iframe 标签 ng-src 路径 z-index 必须有position

    如果直接写路径到iframe标签里的ng-src中会出现报错: 解决方法: 1.ng里面有个属性是专门用来解决跨域问题的 $sce. 用法: $scope.someUrl = $sce.trustAs ...

  10. python SimpleHTTPServer 快速共享文件

    简单介绍 通过一个python命令快速共享文件给他人. 操作步骤 1.打开cmd命令行,切换到需要共享文件的目录,执行命令 python -m SimpleHTTPServer . 2.打开浏览器,在 ...