题目描述

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入x数

  2. 删除x数(若有多个相同的数,因只删除一个)

  3. 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)

  4. 查询排名为x的数

  5. 求x的前驱(前驱定义为小于x,且最大的数)

  6. 求x的后继(后继定义为大于x,且最小的数)

输入输出格式

输入格式:

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号( 1 \leq opt \leq 61≤opt≤6 )

输出格式:

对于操作3,4,5,6每行输出一个数,表示对应答案

输入输出样例

输入样例#1: 复制

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
输出样例#1: 复制

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)的更多相关文章

  1. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  2. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  3. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

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

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  5. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  6. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  7. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  8. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  9. P3369 【模板】普通平衡树 Treap

    P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...

  10. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

随机推荐

  1. 用chattr命令防止系统中某个关键文件被修改

    用chattr命令防止系统中某个关键文件被修改:# chattr +i /etc/resolv.conf

  2. java influx DB工具类

    配置 application-properties: spring.influxdb.url=${influxdb_host:127.0.0.1} spring.influxdb.port=${inf ...

  3. Visual Studio 2013/15/17小技巧

    1.Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 2.当有多个断点时,按F5可以切换到下一个断点. 3.Ctrl+Shift+空格 显示函数签名,上下键可以查看所 ...

  4. sqlserver2008+日志收缩sql语句命令

    USE[master] GO ALTER DATABASE 数据库 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 数据库 SET RECOVER ...

  5. 数据结构之链表(LinkedList)(二)

    数据结构之链表(LinkedList)(一) 双链表 上一篇讲述了单链表是通过next 指向下一个节点,那么双链表就是指不止可以顺序指向下一个节点,还可以通过prior域逆序指向上一个节点 示意图: ...

  6. seo是什么

    SEO(Search Engine Optimization):汉译为搜索引擎优化.搜索引擎优化是一种利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式. SEO的目的是:为网站提供 ...

  7. 【日语】日语能力考试N2级核心词汇必备—接续词

    日语能力考试N2级核心词汇必备—接续词 顺接 だから 因为......所以......(下文可用命令,意志劝诱等)その結果  其结果(口语,书面语都行,但是比较生硬)したがって  从而,因而(书面语, ...

  8. linux操作常用命令

    此篇文章是根据自己经常使用的命令进行记录备忘,不断更新 防火墙(centos7) 永久开放某个端口号: firewall-cmd --zone=public --add-port=8080/tcp - ...

  9. BLE 广播格式定义

    低功耗蓝牙两类报文 : 广播报文 和 数据报文. 本文讨论广播报文数据段,不包括完整报文其他部分,比如前导,接入地址等 蓝牙设备通过广播表明自己的存在,等待被连接, 就好象一个人站在接口大喊“我要脱单 ...

  10. HTML和XML中的转义字符

    HTML中的转义字符  HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用他们的转义序列,如下所示: & ...