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. 基于Linux整形时间的常用计算思路

    上一次分享了Linux时间时区详解与常用时间函数,相信大家对Linux常见时间函数的使用也有了一定的了解,在工作中遇到类似获取时间等需求的时候也一定能很好的处理.本文基于Linux整形时间给出一些简化 ...

  2. Spring JDBC查询返回对象代码跟踪

    在封装方法的时候突然发现通过 ResultSetMetaData的getColumnCount()获取到的列明会多一列(ROWSTAT),而且每次的值都是1,目前没有找到相关信息,在国外网站上看到有类 ...

  3. 【BZOJ2728】[HNOI2012]与非 并查集+数位DP

    [BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述.  ...

  4. ElasticSearch(二十四)基于scoll技术滚动搜索大量数据

    1.为什么要使用scroll? 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scoll滚动查询,一批一批的查,直到所有数据都查询完处理完 2.原理 使用scoll滚动搜索,可以 ...

  5. goland中引用包

    首先在工程目录下新建三个目录:bin, pkg,src Bin文件夹是放置编译后的exe文件 Pkg文件夹是放置包生成后的.a文件 Src文件夹是放置包文件的地方 工程组织目录如下,在src中有tes ...

  6. python网络爬虫之scrapy 调试以及爬取网页

    Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...

  7. android 中使用svg

    http://www.see-source.com/blog/300000038/1189.html http://www.jianshu.com/p/30dfa5920658#

  8. git push问题 objects/pack/tmp_pack_XXXXXX': Permission denied

    1.上传时的权限问题 在执行git push origin master之后,上传过程中报出如下错误: objects/pack/tmp_pack_XXXXXX': Permission denied ...

  9. centos 安装 jdk PostgreSQL

    1.下载: anzhuang  jDK http://blog.csdn.net/youzhouliu/article/details/51183115 ----------------------- ...

  10. 更换好的yum源

    最近重装了虚拟机,因为之前总是碰到一些 yum的软件太 旧了,索性重装了 虚拟机,从零开始,然后配置yum源,以便以后安装 插件包的时候是最新的.如下: 1,进入yum源配置目录cd /etc/yum ...