P3369 【模板】普通平衡树FHQtreap
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 原名:普通平衡树
在此鸣谢
code
#include<cstdio>
#include<algorithm> using namespace std; const int N = ;
int ch[N][],siz[N],key[N],val[N];
int tn,Root; inline char nc() {
static char buf[],*p1 = buf,*p2 = buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2) ? EOF : *p1++;
}
inline int read() {
int x = ,f = ;char ch = getchar();
for (; ch<''||ch>''; ch = getchar())
if (ch=='-') f = -;
for (; ch>=''&&ch<=''; ch = getchar())
x = x*+ch-'';
return x * f;
}
inline void pushup(int x) {
siz[x] = siz[ch[x][]] + siz[ch[x][]] + ;
}
inline int makenode(int x) {
++tn;val[tn] = x;siz[tn] = ;key[tn] = rand();return tn;
} int Merge(int x,int y) {
if (!x || !y) return x + y;
if (key[x] < key[y]) {
ch[x][] = Merge(ch[x][],y);
pushup(x); return x;
}
else {
ch[y][] = Merge(x,ch[y][]);
pushup(y); return y;
}
}
void Split(int now,int k,int &x,int &y) {
if (!now) x = y = ;
else {
if (val[now] <= k)
x = now,Split(ch[now][],k,ch[now][],y);
else
y = now,Split(ch[now][],k,x,ch[now][]);
pushup(now);
}
}
inline int getkth(int p,int k) {
while (true) {
if (k == siz[ch[p][]] + ) return p;
if (ch[p][] && k <= siz[ch[p][]]) p = ch[p][];
else k-= ((ch[p][] ? siz[ch[p][]] : ) + ),p = ch[p][];
}
}
int main() {
int x,y,z,opt,k,n = read();
while (n--) {
opt = read(),k = read();
if (opt==) {
Split(Root,k,x,y);
Root = Merge(Merge(x,makenode(k)),y);
}
else if (opt==) {
Split(Root,k,x,y);
Split(x,k-,x,z);
z = Merge(ch[z][],ch[z][]);
Root = Merge(Merge(x,z),y);
}
else if (opt==) {
Split(Root,k-,x,y);
printf("%d\n",siz[x]+);
Root = Merge(x,y);
}
else if (opt==)
printf("%d\n",val[getkth(Root,k)]);
else if (opt==) {
Split(Root,k-,x,y);
printf("%d\n",val[getkth(x,siz[x])]);
Root = Merge(x,y);
}
else {
Split(Root,k,x,y);
printf("%d\n",val[getkth(y,)]);
Root = Merge(x,y);
}
}
return ;
}
P3369 【模板】普通平衡树FHQtreap的更多相关文章
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 【洛谷P3369】 (模板)普通平衡树
https://www.luogu.org/problemnew/show/P3369 Splay模板 #include<iostream> #include<cstdio> ...
- [luogu3369]普通平衡树(fhq-treap模板)
解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- 【模板】平衡树——Treap和Splay
二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...
- 【洛谷P3369】普通平衡树——Splay学习笔记(一)
二叉搜索树(二叉排序树) 概念:一棵树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉搜索树 ...
- 洛谷.3369.[模板]普通平衡树(Splay)
题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...
- 洛谷.3369.[模板]普通平衡树(fhq Treap)
题目链接 第一次(2017.12.24): #include<cstdio> #include<cctype> #include<algorithm> //#def ...
随机推荐
- Uncaught Error: Bootstrap's JavaScript requires jQuery
在写bootstarp的时候,一直报 Uncaught Error: Bootstrap's JavaScript requires jQuery 查看了自己引入的文件路径是对的,也可以使用jquer ...
- Oracle中文乱码,字符集问题处理
1. 右键计算机,选择属性,增加环境变量 NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.进入注册表,依次单击HKEY_LOCAL_MACHINE --> ...
- 死磕 java原子类之终结篇(面试题)
概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...
- Random类、ThreadLocalRandom类
Random和ThreadLocalRandom类均用于生成伪随机数. Random的构造函数: Random() 默认以系统当前时间为种子,相当于Random(System.currentT ...
- 图解HTTP总结
一.TCP/IP 的分层管理 二.TCP/IP通信传输流 ARP地址解析协议参考:https://www.cnblogs.com/csguo/p/7527303.html 三.各种协议与HTTP协议的 ...
- gulp运行步骤
一.运行→输入cmd→跳出命令窗口二.cd D: 敲回车进入D盘,cd www 进入项目路径 cd mygulp三.执行 cnpm install gulp --save-dev 命令 (初始化安装g ...
- [转载]SAP预装服务器全编译
一.说明 SAP系统初始安装后,每当事物码第一次运行时,GUI的左下角会显示编译的状态(如图 1所示),费时很多尤其是对于一些业务内容很丰富的事物码如ME21N.VA01. 图 1 编译状态 产生编译 ...
- html 获取和写入cookie的 方法
//取Cookie的值 function getCookie(cookie_name) { var allcookies = document.cookie; v ...
- BZOJ 1396:识别子串 SA+树状数组+单调队列
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 381 Solved: 243[Submit][Status][Discuss] ...
- Leetcode重点 250题-前400 题
删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...