[P3369]普通平衡树(Splay版)
模板,不解释
#include<bits/stdc++.h>
using namespace std;
const int mxn=1e5+5;
int fa[mxn],ch[mxn][2],sz[mxn],cnt[mxn],val[mxn],rt,tot;
namespace Splay {
void push_up(int x) {
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
};
void rotate(int x) {
int y=fa[x],z=fa[y],tp=ch[y][1]==x;
ch[z][ch[z][1]==y]=x,fa[x]=z; //这里容易写错
ch[y][tp]=ch[x][tp^1],fa[ch[x][tp^1]]=y;
ch[x][tp^1]=y,fa[y]=x;
push_up(y),push_up(x);
};
void splay(int x,int gl) {
while(fa[x]!=gl) {
int y=fa[x],z=fa[y];
if(z!=gl)
(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
rotate(x);
}
if(gl==0) rt=x;
};
void find(int x) {
int u=rt;
while(ch[u][x>val[u]]/*这里不一定find的到该值,所以一定要加这句话*/&&x!=val[u]) u=ch[u][x>val[u]];
splay(u,0);
};
int kth(int k) {
int u=rt;
while(1) {
if(k<=sz[ch[u][0]]) u=ch[u][0];
else if(k>sz[ch[u][0]]+cnt[u]) k-=sz[ch[u][0]]+cnt[u],u=ch[u][1];
else return u;
}
};
void ins(int x) {
int u=rt,f=0;
while(val[u]!=x&&u) f=u,u=ch[u][x>val[u]];
if(u==0) {
u=++tot;
if(f) ch[f][x>val[f]]=u;
val[u]=x; fa[u]=f;
cnt[u]=sz[u]=1;
}
else ++cnt[u];
splay(u,0);
};
int pre(int x) {
find(x);
if(val[rt]<x) return rt;
int u=ch[rt][0];
while(ch[u][1]) u=ch[u][1];
return u;
};
int nxt(int x) {
find(x);
if(val[rt]>x) return rt;
int u=ch[rt][1];
while(ch[u][0]) u=ch[u][0];
return u;
};
void erase(int x) {
find(x);
if(cnt[rt]>1) --cnt[rt];
else {
int l=pre(x),r=nxt(x); //这里容易写错
splay(l,0); splay(r,l);
ch[r][0]=0;
}
};
}
int main()
{
using namespace Splay;
int t,opt,x;
scanf("%d",&t);
ins(-1000000000),ins(1000000000);//切记插入端点,否则前驱后继不好求
while(t--) {
scanf("%d %d",&opt,&x);
if(opt==1) ins(x);
else if(opt==2) erase(x);
else if(opt==3) find(x),printf("%d\n",sz[ch[rt][0]]);
else if(opt==4) printf("%d\n",val[kth(x+1)]);
else if(opt==5) printf("%d\n",val[pre(x)]);
else printf("%d\n",val[nxt(x)]);
}
return 0;
}
[P3369]普通平衡树(Splay版)的更多相关文章
- 【数据结构】平衡树splay和fhq—treap
1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小, ...
- hiho #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- 平衡树——splay 三
前文链接: 平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) 平衡树--splay 二 - yi_fan0305 - 博客园 (cnblogs.com) 再补 ...
- 平衡树——splay 二
上文传送门:平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) OK,我们继续上文,来讲一些其他操作. 七.找排名为k的数 和treap的操作很像,都是通过比较 ...
随机推荐
- Java+selenium之WebDriver的cookie,等待等高级操作(五)
1. 操作cookie // 增加一个 name = "name",value="value" 的 cookie Cookie cookie = new Coo ...
- tomcat安装出现的闪退问题
如果闪退 在该文件中结尾添加pause 可以检测到路径问题是不是有问题
- BZOJ 2818 Gcd(欧拉函数+质数筛选)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 9108 Solved: 4066 [Submit][Status][Discu ...
- java.io几种读写文件的方式
一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作 ...
- TFS: 解决The build agent error - the session for this agent already exists
来源:http://ericphan.net/blog/2016/6/10/solving-the-tfs-build-agent-error-the-session-for-this-agent-a ...
- Zabbix 3.2.6通过SNMP和iDRAC监控DELL服务器
https://www.cnblogs.com/saneri/p/7772641.html
- 3步实现ssh面密码登录
1.上次本机的公钥和私钥 [root@vicweb ~]#ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in ...
- 排查Linux机器是否已被入侵
来自--马哥Linux运维 1.入侵者可能会删除机器的日志信息 ,可以查看日志信息是否存在后者被清除 [root@zklf-server02 ~]# ll -h /var/log/ total 3.4 ...
- Json传递数据两种方式(json大全)
1.Json传递数据两种方式(json大全)----------------------------字符串 var list1 = ["number","name&quo ...
- Codeforces 436E Cardboard Box (看题解)
Cardboard Box 贪了个半天贪不对, 我发现我根本就不会贪心. 我们先按b排序, 然后枚举选两颗心的b的最大值, 在这个之前的肯定都要选一个, 因为前面的要是一个都没选的话, 你可以把当前选 ...