Splay P3369 【模板】普通平衡树(Treap/SBT)
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
- 求x的后继(后继定义为大于x,且最小的数)
输入输出格式
输入格式:
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号( 1 \leq opt \leq 61≤opt≤6 )
输出格式:
对于操作3,4,5,6每行输出一个数,表示对应答案
输入输出样例
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
106465
84185
492737
说明
时空限制:1000ms,128M
1.n的数据范围: n \leq 100000n≤100000
2.每个数的数据范围: [-{10}^7, {10}^7][−107,107]
来源:Tyvj1728 原名:普通平衡树
在此鸣谢
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; const int N = 1e5+;
const int INF = ; int n, opt, x;
struct NODE
{
NODE *fa;
NODE *son[];
int siz;
int num, cnt;
}node[N]; typedef NODE* Tree;
Tree Root, now_node, null; inline void init()
{
Root = now_node = null = node;
null->son[] = null->son[] = null;
} inline int read()
{
char c = getchar(); int num = , f = ;
for(; !isdigit(c); c = getchar())
f = c == '-' ? - : f;
for(; isdigit(c); c = getchar())
num = num * + c - '';
return num * f;
} inline Tree new_node(int num, Tree fa)
{
++ now_node;
now_node->siz = ;
now_node->num = num;
now_node->fa = fa;
now_node->son[] = now_node->son[] = null;
return now_node;
} inline bool getgx(Tree root)
{
return root->fa->son[] == root;
} inline void connect(Tree root, Tree fa, bool flag)
{
if(fa != null)
fa->son[flag] = root;
else
Root = root;
root->fa = fa;
} inline void update(Tree root)
{
root->siz = root->son[]->siz + root->son[]->siz + root->cnt;
} inline void rotate(Tree root)
{
Tree fa = root->fa;
bool a = getgx(root), b = !a;
connect(root->son[b], fa, a);
connect(root, fa -> fa, getgx(fa));
connect(fa, root, b);
update(fa);
update(root);
if(root->fa == null)
Root = root;
} inline void splay(Tree root, Tree goal)
{
for(; root->fa != goal; rotate(root))
if(root->fa->fa != goal)
rotate(getgx(root) == getgx(root->fa) ? root->fa : root);
} void insert(int num)
{
if(Root == null)
{
Root = new_node(num, null);
Root->cnt = ;
}
else
{
Tree root = Root;
for(; root->num != num; root = root->son[num > root->num])
{
++ (root->siz);
if(root->son[num > root->num] == null)
root->son[num > root->num] = new_node(num, root);
}
++ (root->cnt);
splay(root, null);
}
} void erase(int num)
{
if(Root == null)
return;
else
{
Tree root = Root;
for(;root != null && root->num != num; root = root->son[num > root->num]);
if(root == null)
return;
splay(root, null);
-- (root->cnt);
if(!root->cnt)
{
if(root->son[] != null)
{
Tree tmp = root->son[];
for(;tmp->son[] != null; tmp = tmp->son[]);
splay(tmp, null);
Root->son[] = root->son[];
if(Root->son[] != null)
Root->son[]->fa = Root;
}
else
{
Root = root->son[];
Root->fa = null;
}
}
}
} inline int query_rank(int num)
{
int rank = ;
for(Tree root = Root; root != null; root = root->son[num > root->num])
{
if(num == root->num)
return rank + root->son[]->siz + ;
if(num > root->num)
rank += root->son[]->siz + root->cnt;
}
return rank;
} inline int query_num(int rank)
{
for(Tree root = Root; root != null; )
{
if(rank <= root->son[]->siz)
root = root->son[];
else if(rank > root->son[]->siz + root->cnt)
rank -= root->son[]->siz + root->cnt, root = root->son[];
else
return root->num;
}
} inline int query_pre(int x)
{
int pre = -INF;
for(Tree root = Root; root != null; root = root->son[x > root->num])
{
if(x > root->num)
pre = max(pre, root->num);
}
return pre;
} inline int query_nxt(int x)
{
int nxt = INF;
for(Tree root = Root; root != null; root = root->son[x >= root->num])
{
if(root->num > x)
nxt = min(nxt, root->num);
}
return nxt;
} int main()
{
init();
n = read();
for(int i = ; i <= n; ++ i)
{
opt = read(), x = read();
switch(opt)
{
case :
insert(x); break;
case :
erase(x); break;
case :
printf("%d\n", query_rank(x)); break;
case :
printf("%d\n", query_num(x)); break;
case :
printf("%d\n", query_pre(x)); break;
default:
printf("%d\n", query_nxt(x));
}
}
return ;
}
Splay P3369 【模板】普通平衡树(Treap/SBT)的更多相关文章
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 【模板】平衡树——Treap和Splay
二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
[模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- P3369 【模板】普通平衡树 Treap
P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
随机推荐
- 处理ajax数据;数据渲染(细节)
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通 ...
- win10环境下,让所有程序都以管理员身份运行的办法
记录下,备查! 打开gpedit.msc组策略编辑. 左侧依次找到:计算机配置->Window设置->安全设置->本地策略->安全选项 然后再右侧找到:用户账户控制:以管理员批 ...
- 20190705-记IIS发布.NET CORE框架系统之所遇
新手在IIS上发布.NET CORE框架的系统之注意事项 序:本篇随笔是我的处子笔,只想记录自己觉得在系统发布过程中比较重要的步骤,一来,忝作自己的学习笔记,以备不时之需,二来,也希望可以帮助有需要的 ...
- vue.js+DRF跨域访问图片
一.背景 在前后端分离过程时,后端服务器只开放本地接口,而前端则开放IP接口,在DRF响应请求时,会把域名(locahost+port)响应给前端服务器,前端服务器把再把数据响应给浏览器,浏览器在解析 ...
- 【转载】Asp.Net中Cookie对象的作用以及常见属性
Cookie对象是服务器为用户访问存储的特定信息,这些信息一般存储在浏览器中,服务器可以从提交的数据中获取到相应的Cookie信息,Cookie的最大用途在于服务器对用户身份的确认,即票据认证,用户会 ...
- Map和TreeMap的特点
Map的特点: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 TreeMap的特点: 无序,不允许重复(无序指元素顺序与添加顺序不一致) TreeMap集合默认会对键进行排 ...
- vue 使用vue-video-player播放hls格式视频
安装 vue-video-player 在 “ devDependencies ” 中 安装 videojs-contrib-hls 在“ dependencies ”中 main.js 中 ...
- Python 使用gevent下载图片案例
import urllib.request import gevent from gevent import monkey monkey.patch_all() def downloader(img_ ...
- JMeter测试HBase
在网上找了关于jmeter连接hbase的方式,主要分为两种:通过导入jar包连接(Java Request)和通过BeanShell远程连接,由于刚接触jmeter没多久,对BeanShell还不熟 ...
- Android笔记(二十二) Android中的GridView
GridView和ListView一样,是Android中比较常见的布局控件,譬如我们的手机桌面其实就是一个GridView. 效果: 实现过程和ListView类似,也是通过Adapter将数据源展 ...