题目描述

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

  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. ps 指令

    ps显示系统当前进程信息, ps 存在多个版本,因此 ps options 的种类繁多.这里只列举平时开发过程中常用的命令,如果有错误或者更好的例子.烦请在评论区指出 语法 ps [options] ...

  2. BZOJ4400 TJOI2012桥(最短路+线段树)

    首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...

  3. Golang官方log包详解

    Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...

  4. hdu 6185 递推+矩阵快速幂

    思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下)  假设 ...

  5. 递推问题 hdu 2046 与1143的比对

    2046 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:   Input 输入数据由多行组成,每行 ...

  6. hdu.. 基础二分的精度问题

    #include<stdio.h>#include<iostream>using namespace std;double f(double x){ return 8*x*x* ...

  7. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. Python实现行列式计算

    数学公式: 代码: # 逆序数 def getInversion(numlist): count = 0 for i in range(1,len(numlist)): subscript = num ...

  9. 【转载】 Asp.Net MVC网站提交富文本HTML标签内容抛出异常

    今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...

  10. Java 之 文件过滤器

    在学习过滤器之前,先来做一个案例. 题目:文件搜索,搜索 D:\java 目录中 .java 文件. 分析: 1.  目录搜索,无法判断多少级目录,使用递归,遍历所有目录 2.  遍历目录时,获取的子 ...