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 ...
随机推荐
- github入门基础之上传本地文件以及安装github客户端
github 不会使用,参照了其他大神的博客看的,很不错,就按步骤来,大家可以看看 http://www.cnblogs.com/wangzhongqiu/p/6243840.html
- python 基础 9.5 数据库连接池
一. 数据库连接池 python 编程中可以使用MySQLdb 进行数据库的连接及诸如查询,插入,更新等操作,但是每次连接mysql 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- LINQ分页工具
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- React-Native在gitHub下载的Demo不能运行问题!!!
1.目前找到的最可行的运行React-Native Demo的解决方案 请参考:http://blog.csdn.net/shubinniu/article/details/52873250 2.检查 ...
- Netty 高并发 (长文)
目录 Netty+Zookeeper 亿级 高并发实战 (长文) 写在前面 1. 高并发IM架构与部分实现 1.1. 高并发的学习和应用价值 1.1.1. 高并发IM实战的价值 1.1.2. 高并发I ...
- php输出缓冲区
ob_start(); echo 'aaa'; $string = ob_get_contents(); file_put_contents('a.html', $string); ob_flush( ...
- Power Designer体验之旅
版权声明:本文为博主原创文章.未经博主允许不得转载. https://blog.csdn.net/wang13667539325/article/details/36025245 从某种程度上说.不论 ...
- mysql 自连接查询数据
今天项目BOSS提了个sql语句需求,我听得稀里糊涂,没办法,一步步讨论.实践,最终搞定. 先上建表语句: /* Navicat MySQL Data Transfer Source Server : ...
- C#练习DataReader
SQL代码: create database ThreeDb go USE ThreeDb; GO CREATE TABLE classify --分类表 ( id ,), name ) not nu ...
- Redis持久化——问题定位与优化(三)
核心知识点: 1.fork操作 a.在RDB或AOF重写时,会执行fork操作创建子进程,fork操作是一个重量级操作. b.改善fork操作耗时的手段:避免使用Xen.配置Redis实例最大使用内存 ...