复习了一下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 普通平衡树的更多相关文章

  1. 【BZOJ 3224】普通平衡树 模板题

    删除节点时把节点splay到根: 然后把根左子树的最右边节点splay到根的左孩子上: 然后删除就可以了: 我的教训是删根的时候根的右孩子的父亲指针一定要记得指向根的左孩子!!! my AC code ...

  2. 【BZOJ 3224】 普通平衡树

    [题目链接] 点击打开链接 [算法] 本题是Splay模板题,值得一做! [代码] #include<bits/stdc++.h> using namespace std; #define ...

  3. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  4. BZOJ 3224 普通平衡树(Treap模板题)

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

  5. 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...

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

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

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

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

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

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

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

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

随机推荐

  1. FDMemTable的详细使用方法

    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Var ...

  2. C# 9.0新特性

    CandidateFeaturesForCSharp9 看到标题,是不是认为我把标题写错了?是的,C# 8.0还未正式发布,在官网它的最新版本还是Preview 5,通往C#9的漫长道路却已经开始.前 ...

  3. md5sum使用注意事项

    1. linux 命令行的 md5sum命令 echo -n "123456" | md5sum     //echo的时候, 默认是自带回车的, 必须要去掉 -n 去掉回车. 2 ...

  4. vi和vim上查找字符串

    方法/步骤 1 我们以samba的配置文件为例,搜索一个user的字符串. vim /etc/samba/smb.conf 打开smb.conf 2 命令模式下,输入/user "/&quo ...

  5. leetcode ----Trie/stack专题

    一:Implement Trie (Prefix Tree) 题目: Implement a trie with insert, search, and startsWith methods. Not ...

  6. python05-09

    一.lambda表达式 def f1(): return 123 f2 = lambda : 123 def f3 = (a1,a2): return a1+a2 f4 = lambda a1,a2 ...

  7. LoadRunner---http请求中对中文参数的处理

    Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...

  8. 解决Struts配置文件里无提示信息的问题

    (1)在struts2配置文件编写的时候.有可能无法提示所有信息,在配置文件里打个"<" 后,并没有不论什么的提示信息(使用快捷键Alt+/ 也不提示) 原因是下边的  &q ...

  9. Orange's_1_win7下搭建环境

    工欲善其事,必先利其器. 由于公司电脑工作环境是win7,为了学习于渊的Orange,所以就在windows下配置环境:   1.nasm: nasm汇编 http://www.nasm.us/    ...

  10. Cordova打包vue项目(Android)

    准备工作: 安装好必要环境: vue-cli,webpack,node.js,android环境 (http://cordova.axuer.com/docs/zh-cn/latest/guide/p ...