bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=3224
思路:
splay树模板题:
推荐博客:https://blog.csdn.net/clove_unique/article/details/50630280
b站上splay树的讲解视频也可以看下,讲的很好,推荐看完视频了解了splay的原理再写
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e5+;
const int inf = <<;
struct node{
int fa,s[],x,size,cnt;
}tr[M];
int top,root,n;
void pushup(int k){
tr[k].size = tr[tr[k].s[]].size+tr[tr[k].s[]].size+tr[k].cnt;
} void rotate(int k){
int x = tr[k].fa,y = tr[x].fa,b=tr[x].s[]==k;
tr[y].s[tr[y].s[]==x]=k;tr[k].fa=y;
tr[x].s[b]=tr[k].s[b^]; tr[tr[k].s[b^]].fa=x;
tr[k].s[b^]=x; tr[x].fa = k;
pushup(x); pushup(k);
} void splay(int x,int go){ //伸展操作
int y = tr[x].fa,z = tr[y].fa;
for(;tr[x].fa^go;rotate(x)){
y = tr[x].fa,z = tr[y].fa;
if(z^go) (tr[y].s[] == x)^(tr[z].s[]==y)?rotate(x):rotate(y);
}
if(!go) root = x;
} void insert(int x){ //插入操作
int u = root,fa = ;
for(;u&&tr[u].x^x;u=tr[u].s[x>tr[u].x]) fa = u;
if(u) tr[u].cnt++; //若已经有这个数了,到cnt++即可
else{ //新建一个节点
u = ++top;
if(fa) tr[fa].s[x>tr[fa].x] = u;
tr[top].fa = fa;tr[top].x = x;tr[top].cnt = tr[top].size = ;
}
splay(u,); //splay 到根
}
//这个函数还有一个功能是把一个跟x不相隔仍荷属的数转移到根
int rank(int x){ //查找x的排名
int u = root;
if(!u) return ;
for(;tr[u].s[x>tr[u].x]&&x^tr[u].x;u=tr[u].s[x>tr[u].x]);
splay(u,); //splay 到根
return tr[tr[u].s[]].size;
}
//求x的前驱后继
int next(int x,int f){ //f=0表示前驱,f=1表示后继,返回的是编号
rank(x); //将与x不相隔任何数的数转移到根
int u = root;
if(tr[u].x>x&&f||tr[u].x<x&&!f) return u; //若已经是答案,则返回
u = tr[u].s[f];
while(tr[u].s[f^]) u = tr[u].s[f^]; //查找前驱时在左子树中查找最大值,后继反之
return u;
} void erase(int x){
int up = next(x,),lo = next(x,),u; //得到前驱后继
splay(lo,); splay(up,lo); //移成一个好局面
u = tr[up].s[];
if(tr[u].cnt > ){
tr[u].cnt--;
splay(u,);
}
else {
tr[up].s[] = ;
pushup(up); pushup(lo);
}
} int find(int x){
x++;
int u = root,son;
if(tr[u].size < x) return ; //没有这个数
while(){
son = tr[u].s[];
if(tr[son].size >= x) u = son;
else if(x>tr[son].size+tr[u].cnt)
x -= tr[son].size + tr[u].cnt, u = tr[u].s[];
else break;
}
splay(u,);
return tr[u].x;
} int main(){
scanf("%d",&n);
int op,x;
insert(-inf); insert(inf);
for(int i = ;i <= n;i ++){
scanf("%d%d",&op,&x);
switch(op){
case : insert(x);break;
case : erase(x); break;
case : printf("%d\n",rank(x));break;
case : printf("%d\n",find(x)); break;
case : printf("%d\n",tr[next(x,)].x); break;
case : printf("%d\n",tr[next(x,)].x); break;
}
}
return ;
}
bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)的更多相关文章
- 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数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- bzoj 3224/Tyvj 1728 普通平衡树(splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
随机推荐
- C#以管理员用户打开某个程序
static void Main(string[] args) { string path = @"C:\Windows\AppPatch\AppLoc.exe"; Process ...
- bat无故报错打印混乱的解决
1. 下面语句加了一个无意义的ping操作.不加的时候经常报错,报操作数不是数字,实际上打印发现NOW值和格式并没有错误.怀疑是下面操作数太多了,而执行速度又太快,导致执行时总是很容易出错.通过增加一 ...
- Missing value auth-url required for auth plugin password
在控制台输入openstack相关命令时提示如下: openstack user list Missing value auth-url required for auth plugin passwo ...
- LOJ2687 BOI2013 Vim 线头DP
传送门 多图警告!!! 一种很新奇的\(DP\),全网似乎只有一两篇题解-- 首先,序列中的一段\(e\)等价于在跳的过程中这一段\(e\)之后的一个字符必须要经过,并且在最后的答案中加上$2 \ti ...
- CF908D New Year and Arbitrary Arrangement 期望、DP
题目传送门 题意:给出正整数$pa,pb,k$,最开始你有一个空串,每一次你有$\frac{pa}{pa + pb}$的概率向串最后放一个$a$,有$\frac{pb}{pa + pb}$的概率向串最 ...
- odoo订餐系统之菜单设计
1.model类的设计 class MyLunchProduction(osv.Model): _name = "mylunch.production" _description ...
- 【强化学习】python 实现 saras 例一
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10146554.html 说明:将之前 q-learning 实现的例一,用 saras 重新 ...
- Jvm 10 升级笔记
移除了 JPEGCodec https://www.cnblogs.com/liaolongjun/p/6878359.html
- #个人博客作业Week2——关于代码规范的讨论
<1> 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 反驳:官僚制度在一定程度下维持了社会的和谐稳定,一个没有法律.没有拥有完善的管理体制.完全崇尚 ...
- Linux课题实践一
Linux课题实践一 20135318 刘浩晨 1.1应用安装 (1)掌握软件源的维护方法,配置系统使用软件源镜像 删除过期或者重复的软件包:进入”系统设置“-”软件和更新”-”ubuntu软件“- ...