【模板】 非旋转treap
模板:luogu P3369 【模板】普通平衡树
code:
#include <cstdio>
#include <cstdlib>
const int MAX_N=100010;
int rd() {
int x=0,fla=1; char c=' ';
while(c<'0' or c>'9') {c=getchar();if(c=='-') fla=-fla;}
while(c>='0' and c<='9') x=x*10+c-'0',c=getchar();
return x*fla;
}
struct node{
node *ch[2]; int data,key,size;
node () {}
node(int w,node *son) {ch[0]=ch[1]=son, data=w, key=rand(), size=1;}
void updata () {size = ch[0]->size + ch[1]->size +1;}
}nil,t[MAX_N],*null,*len,*root;;
void init() {
nil=node(0,NULL); null= &nil;
null->ch[0]=null->ch[1]=null;
null->size=0; len=t; root=null;
}
node* newnode(int x) {
*len=node(x,null);
return len++;
}
node* merge(node* a,node* b) {
if(a==null or b==null) return a==null?b:a;
if(a->key > b->key) {a->ch[1]=merge(a->ch[1],b); a->updata(); return a;}
else {b->ch[0]=merge(a,b->ch[0]); b->updata(); return b;}
}
void split(node* x,int k,node* &l,node* &r) {
if(x==null) {l=r=null;return ;}
if(x->data <= k) {l=x; split(l->ch[1],k,l->ch[1],r);}
else {r=x; split(r->ch[0],k,l,r->ch[0]);}
x->updata();
}
void insert(int k) {
node *l,*r; split(root,k,l,r);
root=merge(merge(l,newnode(k)),r);
}
void erase(int k) {
node *l,*mid,*r; split(root,k-1,l,r); split(r,k,mid,r);
root=merge(l,merge(merge(mid->ch[0],mid->ch[1]) ,r));
}
int kth(node *x,int k) {
if(k <= x->ch[0]->size) return kth(x->ch[0],k);
else if(k > x->ch[0]->size+1) return kth(x->ch[1],k - x->ch[0]->size-1);
return x->data;
}
int find(node *x,int d) {
while(x->ch[d]!=null) x=x->ch[d];
return x->data;
}
int main() {
init(); int q=rd(),c; node *l,*r;
while(q--)
switch(c=rd()) {
case 1:insert(rd());break;
case 2:erase(rd());break;
case 3:split(root,rd()-1,l,r);printf("%d\n",l->size+1);root=merge(l,r);break;
case 4:printf("%d\n",kth(root,rd()));break;
case 5:split(root,rd()-1,l,r);printf("%d\n",find(l,1));root=merge(l,r);break;
case 6:split(root,rd(),l,r);printf("%d\n",find(r,0));root=merge(l,r);break;
}
return 0;
}
【模板】 非旋转treap的更多相关文章
- BZOJ5063旅游——非旋转treap
题目描述 小奇成功打开了大科学家的电脑. 大科学家打算前往n处景点旅游,他用一个序列来维护它们之间的顺序.初 始时,序列为1,2,...,n. 接着,大科学家进行m次操作来打乱顺序.每次操作有6步: ...
- BZOJ1251序列终结者——非旋转treap
题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- 旋转/非旋转treap的简单操作
treap(树堆) 是在二叉搜索树的基础上,通过维护随机附加域,使其满足堆性质,从而使树相对平衡的二叉树: 为什么可以这样呢? 因为在维护堆的时候可以同时保证搜索树的性质: (比如当一棵树的一个域满足 ...
- 非旋转 treap
其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下. 洛谷 P3369 [模板]普通平衡树 code: #include <bits/stdc++.h> #define N 1 ...
- [bzoj3173]最长上升子序列_非旋转Treap
最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...
- 关于非旋转treap的学习
非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...
- [Codeforces702F]T-Shirts——非旋转treap+贪心
题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- BZOJ3224普通平衡树——非旋转treap
题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...
随机推荐
- SQL SERVER高级知识积累
什么叫做高可用服务器? 高可用服务器简单来理解就是不宕机的服务器 什么叫走服务器的自动化灾备? 自动灾备的意思就是,让从服务器自动变成主服务器 sql server的聚合是什么? 事务会引起性能下降, ...
- iOS_25_彩票设置的cell的数据源模型的封装
组模型的封装 SettingGroup // // SettingGroup.h // 25_彩票 // // Created by beyond on 14-8-28. // Copyright ( ...
- error at ::0 can't find referenced pointcut...解决方法
error at ::0 can't find referenced pointcut...解决方法 学习了:http://dyldragon.iteye.com/blog/512612 升级aspe ...
- 6款程序猿不得不爱的bootstrap模板
bootstrap模板是前端project师们的最爱!假设你还没有開始使用Bootstrap模板,那你可真是有够OUT,这是一个帮助你高速开发的工具.Bootstrap是基于jQuery框架开发的,它 ...
- python Flask JQuery使用说明
0.前言 近期因为某种原因再次学习Flask框架.借助博客整理相关内容.Flask框架和Apache+PHP存在少许不同,Flask框架中JS和CSS文件存放于一个相对固定的位置. 普通情况下 ...
- 学习Mockito - Mockito对Annotation的支持
学习Mockito - Mockito对Annotation的支持 博客分类: test junit工作 Mockito支持对变量进行注解,例如将mock对象设为测试类的属性,然后通过注解的方式@M ...
- Codeforces Round #244 (Div. 2)D (后缀自己主动机)
Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...
- Android开发策略:缓存
1.使用缓存策略时,优先考虑使用sdcard(需先推断有无sd卡及其剩余空间是否足够,够的话就开辟一定空间如10M): 2.获取图片时.先从sdcard上找,有的话使用该图片并更新图片最后被使用的时间 ...
- BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...
- bzoj4247: 挂饰(背包)
4247: 挂饰 题目:传送门 题解: 看完题目很明显的一道二维背包(一开始还推错了) 设f[i][j]表示前i个挂饰选完(可以有不选)之后还剩下j个挂钩的最大值(j最多贡献为n) 那么f[i][j] ...