Description

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

Input

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

Output

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

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

HINT

1.n的数据范围:n<=100000
2.每个数的数据范围:[-1e7,1e7]

Source

平衡树

Splay模板题,膜了YveH爷的模板,不过代码好长,常数还很大。。。好歹是打粗来了

 #include <cstdio>
using namespace std;
struct SplayNode
{
SplayNode *fa,*ch[];
SplayNode();
int data,num,size;
int chr() {return this==fa->ch[];}
void updata() { size=ch[]->size+ch[]->size+num;}
}*null;
SplayNode::SplayNode() {fa=ch[]=ch[]=null; size=; num=;}
int n;
namespace Splay
{
SplayNode *Root;
void MakeTree()
{
null=new SplayNode;
*null=SplayNode();
Root=null;
}
void rotate(SplayNode *x)
{
SplayNode *r=x->fa;
if (r==null || x==null) return;
int t=x->chr();
r->ch[t]=x->ch[t^];
r->ch[t]->fa=r;
if (r->fa==null) Root=x;
else r->fa->ch[r->chr()]=x;
x->fa=r->fa;
x->ch[t^]=r;
r->fa=x;
r->updata();
x->updata();
}
void splay(SplayNode *x,SplayNode *y)
{
for (;x->fa!=y;rotate(x))
if (x->fa->fa!=y)
if (x->chr()==x->fa->chr()) rotate(x->fa);
else rotate(x);
}
void insert(int v)
{
SplayNode *r=Root;
if (Root==null)
{
Root=new SplayNode;
Root->data=v;
Root->updata();
return;
}
if (Root->data==v)
{
Root->num++;
Root->updata();
return;
}
while (r->ch[r->data<v]!=null)
{
r=r->ch[r->data<v];
if (r->data==v)
{
r->num++;
splay(r,null);
return;
}
}
r->ch[r->data<v]=new SplayNode;
r->ch[r->data<v]->data=v;
r->ch[r->data<v]->fa=r;
splay(r->ch[r->data<v],null);
}
SplayNode *Kth(int k)
{
SplayNode *r=Root;
while (r!=null)
{
if (k<=r->ch[]->size) r=r->ch[];
else if (k>=r->ch[]->size+ && k<=r->ch[]->size+r->num) return r;
else
{
k=k-r->ch[]->size-r->num;
r=r->ch[];
}
}
return r;
}
SplayNode *find(int v)
{
SplayNode *r=Root;
while (r!=null)
{
if (r->data==v)
{
splay(r,null);
return r;
}
r=r->ch[r->data<v];
}
return null;
}
SplayNode *pre()
{
SplayNode *r=Root->ch[];
if (r==null) return null;
while (r->ch[]!=null) r=r->ch[];
return r;
}
SplayNode *suc()
{
SplayNode *r=Root->ch[];
if (r==null) return null;
while (r->ch[]!=null) r=r->ch[];
return r;
}
void del(int v)
{
find(v);
SplayNode *q=pre();
SplayNode *p=suc();
if (q==null && p==null)
if (Root->num==) Root=null;
else Root->num--,Root->updata();
if (q==null)
{
splay(p,null);
if (Root->ch[]->num==) Root->ch[]=null,Root->updata();
else Root->ch[]->num--,splay(Root->ch[],null);
return;
}
if (p==null)
{
splay(q,null);
if (Root->ch[]->num==) Root->ch[]=null,Root->updata();
else Root->ch[]->num--,splay(Root->ch[],null);
return;
}
splay(q,null);
splay(p,q);
if (p->ch[]->num==) p->ch[]=null,p->updata();
else p->ch[]->num--,splay(p->ch[],null);
return;
}
}
void solve()
{
int temp,x;
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%d",&temp,&x);
if (temp==) Splay::insert(x);
if (temp==) Splay::del(x);
if (temp==) printf("%d\n",Splay::find(x)->ch[]->size+);
if (temp==) printf("%d\n",Splay::Kth(x)->data);
if (temp==)
{
Splay::insert(x);
printf("%d\n",Splay::pre()->data);
Splay::del(x);
}
if (temp==)
{
Splay::insert(x);
printf("%d\n",Splay::suc()->data);
Splay::del(x);
}
}
}
int main()
{
Splay::MakeTree();
solve();
return ;
}

【BZOJ3224】Tyvj 1728 普通平衡树 Splay的更多相关文章

  1. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  2. [bzoj3224]Tyvj 1728 普通平衡树——splay模板

    题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...

  3. bzoj3224: Tyvj 1728 普通平衡树(平衡树)

    bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...

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

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

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

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

  6. BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...

  7. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

  8. bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)

    (其实今天好热啊? 题目大意:插入,删除,k小,前驱后继,数的排名. splay和treap裸题...过几天补个treap的 splay: #include<iostream> #incl ...

  9. 【Splay】bzoj3224 Tyvj 1728 普通平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

随机推荐

  1. HDU3359 Kind of a Blur(高斯消元)

    建立方程后消元 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring& ...

  2. 攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系

    本文以Customer和Address类的关系为例说明一对一关联映射:以Category和Item类的关系说明多对多关联关系.一.映射一对一关联: 分两种情况:按照外键映射和按照主键映射.这两种方式的 ...

  3. Solr入门之(2)快速启动:第一个例子

    Solr作为一个web应用来启动,因此需要JDK支持,需要WEB容器,本文环境如下: JDK6.0或以上(环境变量设置等不再赘述) Tomcat-6.0.35或以上(自行下载) apache-solr ...

  4. Oracle12c client安裝報錯[INS-20802] Oracle Net Configuration Assistant failed完美解決

    Doc ID 2082662.1 1.錯誤碼 Installation Of Oracle Client 12.1.0.2.0 (32-bit) Fails With An Error Message ...

  5. golang heap container balance request

    package mainimport ( "container/heap" "fmt" "log" "math/rand" ...

  6. ASP.NET 5探险(2):上传文件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在ASP.NET 5(MVC 6)中处理上传文件的方式和之前有所不同. 在MVC 5之 ...

  7. CentOS 6.5下samba服务器搭建与配置

    转自:http://www.centoscn.com/CentosServer/ftp/2014/1023/3989.html 写在前面: 首先关闭防火墙:service iptables stop, ...

  8. 四种方案解决ScrollView嵌套ListView问题(转)

    以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...

  9. Linux学习笔记(1)Linux虚拟机安装过程中的知识点及常用管理工具

    1. VMware的相关知识 (1)建议的VMware的配置: CPU 主频1GHz以上 内存 1GB以上 硬盘 分区空闲空间8GB以上 (2)VMware创建快照 快照的作用是保存虚拟机的现有状态, ...

  10. 词法分析 after Coding

    学习词法分析,认为词法分析很难. 虽然不懂,但是要完成作业. 去图书馆或者看书借鉴代码,修改错误,让代码正常运行. 学习词法分析后,了解到自己有很多的不足: 1.代码不是很熟练,课本知识不了解.知识面 ...