非旋转Treap——普通平衡树
扔板跑……
#include<bits/stdc++.h>
#define N 100010
#define mp make_pair
using namespace std;
typedef pair<int,int> par;
int n,x,rt;
struct Treap_Without_rotate{
int ls[N],rs[N],rnd[N],val[N],size[N],cnt;
inline void pushup(int x){size[x]=size[ls[x]]+size[rs[x]]+;}
par split(int k,int x){
if(!x)return mp(,k);int l=ls[k],r=rs[k];
if(x==size[l]){ls[k]=;pushup(k);return mp(l,k);}
if(x==size[l]+){rs[k]=;pushup(k);return mp(k,r);}
if(x<size[l]){
par tmp=split(l,x);
ls[k]=tmp.second;pushup(k);return mp(tmp.first,k);
}
par tmp=split(r,x-size[l]-);
rs[k]=tmp.first;pushup(k);return mp(k,tmp.second);
}
int merge(int x,int y){
if(x==||y==)return x+y;
if(rnd[x]<rnd[y]){rs[x]=merge(rs[x],y);pushup(x);return x;}
else{ls[y]=merge(x,ls[y]);pushup(y);return y;}
}
int queryrank(int x,int k){
int ans=,tmp=(int)1e9;
while(k){
if(x==val[k])tmp=min(tmp,ans+size[ls[k]]+);
if(x>val[k])ans+=size[ls[k]]+,k=rs[k];
else k=ls[k];
}
return tmp==(int)1e9?ans:tmp;
}
int find(int x,int k){
for(;;){
if(size[ls[k]]==x-)return val[k];
if(size[ls[k]]>x-)k=ls[k];
else x=x-size[ls[k]]-,k=rs[k];
}
}
int querypre(int x,int k){
int ans=-(int)1e9;
while(k){
if(val[k]<x)ans=max(ans,val[k]),k=rs[k];
else k=ls[k];
}return ans;
}
int querysub(int x,int k){
int ans=(int)1e9;
while(k){
if(val[k]>x)ans=min(ans,val[k]),k=ls[k];
else k=rs[k];
}return ans;
}
void ins(int x){
int k=queryrank(x,rt);par tmp=split(rt,k);
val[++cnt]=x;rnd[cnt]=rand();size[cnt]=;
rt=merge(tmp.first,cnt);rt=merge(rt,tmp.second);
}
void del(int x){
int k=queryrank(x,rt);par t1=split(rt,k),t2=split(t1.first,k-);
rt=merge(t2.first,t1.second);
}
}T;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();srand();
for(int i=;i<=n;i++){
int opt=read(),x=read();
if(opt==)T.ins(x);
if(opt==)T.del(x);
if(opt==)printf("%d\n",T.queryrank(x,rt));
if(opt==)printf("%d\n",T.find(x,rt));
if(opt==)printf("%d\n",T.querypre(x,rt));
if(opt==)printf("%d\n",T.querysub(x,rt));
}
return ;
}
非旋转Treap——普通平衡树的更多相关文章
- BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- BZOJ3224普通平衡树——非旋转treap
题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...
- BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)
题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势: AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap
国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...
- 关于非旋转treap的学习
非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...
随机推荐
- Halcon环境搭建
1.Visual Studio 2017安装教程 2.Qt5.9安装教程 3.VS2017中Qt插件安装教程
- 九度OJ--Q1168
import java.util.Scanner; public class q1168 { public static void main(String[] args) { Scanner scan ...
- winform 控件大小随着窗体自适应
3个方法: #region 控件缩放变量 double formWidth;//窗体原始宽度 double formHeight;//窗体原始高度 doubl ...
- C# Lambda表达式使用累加器例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lamb ...
- 一道ioccc题目
国际C语言混乱大赛的一个题: main() {printf(&unix["\021%six\012\0"],(unix)["have"]+"f ...
- struts标签中的select
<!-- Struts下拉列表标签: name="deptId" 下拉列表标签的名称(服务器根据这个名称获取选择的项的实际的值value值) headerKey 默认选择项的 ...
- 【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)
今天考试的时候果然题目太难于是我就放弃了……转而学习了一下最小乘积生成树. 最小乘积生成树定义: (摘自网上一篇博文). 我们主要解决的问题就是当k = 2时,如何获得最小的权值乘积.我们注意到一张图 ...
- [洛谷P1879][USACO06NOV]玉米田Corn Fields
题目大意:有一个$n\times m$的矩阵,$(1 \leq m \leq 12; 1 \leq n \leq 12)$,想在其中的一些格子中种草,一些格子不能种草,且两块草地不相邻.问有多少种种植 ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- 无人值守安装linux系统
需要使用到的服务:PXE + DHCP+TFTP+ Kickstart+ FTP KickStart是一种无人职守安装方式 执行 PXE + KickStart安装需要准备内容: • DHCP 服务 ...