BZOJ 3224 SBT 普通平衡树
复习了一下SBT的模板,但是BZOJ不知道为什么注册不了,所以就没交,测了样例能过!
#include <bits/stdc++.h>
#include<algorithm>
using namespace std;
#define lc ch[0]
#define rc ch[1]
const int MAXN=500000;
const int INF=0x3f3f3f3f;
struct node
{
node* ch[2];
int sz,v;
node(){}
}SBT[MAXN+10],*NILL=new node,*root=NILL,*tot=SBT;
int getint()
{
int ret=0;bool f=0;char ch;
while((ch=getchar())<'0'||ch>'9')f=!f;
while(ch>='0'&&ch<='9')ret=ret*10+(ch-'0');
return f?-ret:ret;
}
void init()
{
NILL->lc=NILL;
NILL->rc=NILL;
NILL->sz=0;
}
//更新子树大小
inline void update(node* r)
{
r->sz=r->lc->sz+rc->sz+1;
}
node* newnode()
{
tot->lc=tot->rc=NILL;
tot->sz=1;
return tot++;
}
void rotate(node* r,bool f)
{
node *t=r->ch[f];
r->ch[f]=t->ch[!f];
t->ch[!f]=r;
t->sz=r->sz;
update(r);
r=t;
}
void mt(node* &r,bool f)//利用左右对称,带上参数f同时减去不必要的检查
{
if(r==NILL)return;//NILL为空指针
if(r->ch[f]->ch[f]->sz>r->ch[!f]->sz)//左左>右
{
rotate(r,f);
}
else if(r->ch[f]->ch[!f]->sz>r->ch[!f]->sz)//左右>右,先旋左儿子,再旋根
{
rotate(r->ch[f],!f);rotate(r,f);
}
else return;
mt(r->ch[f],f);
mt(r,f);
}
void insert(node* &r,int v)
{
if(r==NILL)
{
r=newnode();
r->v=v;
return;
}
r->sz++;
bool k=v>r->v;
insert(r->ch[k],v);
mt(r,k);
}
int del(node* &r,int x)
{
int ret;
r->sz--;
if(r->v==x||(r->lc==NILL&&x<r->v)||(r->rc==NILL&&x>r->v))//删除根节点的情况
{
ret=r->v;
if(r->lc==NILL||r->rc==NILL)
r=r->lc==NILL?r->rc:r->lc;
else
r->v=del(r->lc,x);
}
else ret=del(r->ch[x>=r->v],x);
return ret;
}
int sel(int val)//val的排位
{
int ret=1;
node* p=root;
while(p!=NILL)
{
if(val<=p->v)
{
p=p->lc;
}
else
{
ret+=p->lc->sz+1;
p=p->rc;
}
}
return ret;
}
int rk(int x)//排第x的值
{
node* p=root;
while(p!=NILL)
{
if(x==p->lc->sz+1)
return p->v;
if(x<=p->lc->sz)
p=p->lc;
else
{
x-=p->lc->sz+1;
p=p->rc;
}
}
return INF;
}
//查询前驱(0)后继(1)
int query(int v,bool f)
{
node* p=root;
int ret=f?INF:-INF;
while(p!=NILL)
{
if(p->v!=v&&(f==(p->v>v)&&f==(ret>p->v)))
{
ret=p->v;
}
if(v==p->v)
p=p->ch[f];
else p=p->ch[v>p->v];
}
return ret;
}
int main()
{
init();
int kase=getint();
while(kase--)
{
int opt=getint(),x=getint();
switch(opt)
{
case 1:insert(root,x);break;
case 2:del(root,x);break;
case 3:printf("%d\n",sel(x));break;
case 4:printf("%d\n",rk(x));break;
case 5:printf("%d\n",query(x,0));break;
case 6:printf("%d/n",query(x,1));break;
}
}
return 0;
}
BZOJ 3224 SBT 普通平衡树的更多相关文章
- 【BZOJ 3224】普通平衡树 模板题
删除节点时把节点splay到根: 然后把根左子树的最右边节点splay到根的左孩子上: 然后删除就可以了: 我的教训是删根的时候根的右孩子的父亲指针一定要记得指向根的左孩子!!! my AC code ...
- 【BZOJ 3224】 普通平衡树
[题目链接] 点击打开链接 [算法] 本题是Splay模板题,值得一做! [代码] #include<bits/stdc++.h> using namespace std; #define ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 普通平衡树(Treap模板题)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14301 Solved: 6208 [Submit][ ...
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[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数(若有多个相同的数,因只删除 ...
随机推荐
- 代理服务器squid简介
Squid 是一个高性能.开源的代理缓存服务器和 Web 缓存进程,支持 FTP.Internet Gopher.HTTPS 和 SSL 等多种协议.它通过一个非阻塞的.I/O 事件驱动的单一进程处理 ...
- asp.net core 集成JWT(一)
[什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...
- asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
[前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...
- 转: eclipse 快捷键列表(功能清晰版本)
转自: http://www.uml.org.cn/mobiledev/201110092.asp Eclipse 在开发中使用到的快捷键很实用噢 Ctrl+1 快速修复(最经典的快捷键,就不用多说了 ...
- android 自己定义水平和圆形progressbar 仅仅定义一些style就能够
效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...
- Please enter a commit message to explain why this merge is necessary.
Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...
- 怎样免费设置QQ空间背景音乐
怎样免费设置QQ空间背景音乐 1.打开QQ空间,点击 2. 3. 4.这里它要求我们输入歌曲的在线路径,并且必须是MP3格式的,这就简单了,我们仅仅要去网上找在线的MP3音乐就能够了.可是如今非常多提 ...
- 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数
☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...
- Android-support-v4源码查看
- click event not triggered on bootstrap modal
I am trying to catch the click event when save changes is pushed. For some reason i can't catch the ...