【洛谷P3835】 【模板】可持久化平衡树
可持久化非旋转treap,真的是又好写又好调 ~
code:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define N 500007
#define lson t[x].ls
#define rson t[x].rs
#define inf 2147483647
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int tot;
int cur;
int Pr;
int Nx;
int rt[N];
struct node {
int val;
int size;
int ls,rs;
int ran;
}t[N*50];
int newnode() {
++tot;
t[tot].val=0;
t[tot].size=1;
t[tot].ran=rand();
t[tot].ls=t[tot].rs=0;
return tot;
}
void pushup(int x) {
t[x].size=t[lson].size+t[rson].size+1;
}
void split(int x,int v,int &l,int &r) {
if(!x) {
l=r=0;
}
else {
int now=newnode();
t[now]=t[x];
if(t[x].val<=v) {
l=now;
split(rson,v,t[l].rs,r);
}
else {
r=now;
split(lson,v,l,t[r].ls);
}
pushup(now);
}
}
int merge(int x,int y) {
if(!x||!y) {
return x+y;
}
int now=newnode();
if(rand()%(x+y)<x) {
t[now]=t[x];
t[now].rs=merge(t[x].rs,y);
}
else {
t[now]=t[y];
t[now].ls=merge(x,t[y].ls);
}
pushup(now);
return now;
}
void Insert(int val) {
int x=0;
int y=0;
split(rt[cur],val,x,y);
int _new=newnode();
t[_new].val=val;
_new=merge(x,_new);
y=merge(_new,y);
rt[cur]=y;
}
void Delete(int val) {
int x=0;
int y=0;
int z=0;
split(rt[cur],val,x,z);
split(x,val-1,x,y);
if(y) {
y=merge(t[y].ls,t[y].rs);
}
y=merge(x,y);
z=merge(y,z);
rt[cur]=z;
}
int Rank(int val) {
int x=0;
int y=0;
split(rt[cur],val-1,x,y);
int re=t[x].size+1;
rt[cur]=merge(x,y);
return re;
}
void Pre(int x,int val) {
if(!x) {
return;
}
if(t[x].val<val) {
Pr=max(Pr,t[x].val);
Pre(rson,val);
}
else {
Pre(lson,val);
}
}
void Nxt(int x,int val) {
if(!x) {
return;
}
if(t[x].val>val) {
Nx=min(Nx,t[x].val);
Nxt(lson,val);
}
else {
Nxt(rson,val);
}
}
// 查询排名为 x 的数
int Num(int x,int kth) {
if(t[lson].size+1==kth) {
return t[x].val;
}
if(kth<=t[lson].size) {
return Num(lson,kth);
}
else {
return Num(rson,kth-t[lson].size-1);
}
}
int main() {
// setIO("input");
int i,j,m;
scanf("%d",&m);
for(cur=1;cur<=m;++cur) {
int v,opt,x;
scanf("%d%d%d",&v,&opt,&x);
rt[cur]=rt[v];
if(opt==1) {
Insert(x);
}
if(opt==2) {
Delete(x);
}
if(opt==3) {
printf("%d\n",Rank(x));
}
if(opt==4) {
printf("%d\n",Num(rt[cur],x));
}
if(opt==5) {
Pr=-inf;
Pre(rt[cur],x);
printf("%d\n",Pr);
}
if(opt==6) {
Nx=inf;
Nxt(rt[cur],x);
printf("%d\n",Nx);
}
}
return 0;
}
【洛谷P3835】 【模板】可持久化平衡树的更多相关文章
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...
- 洛谷 P3835: 【模板】可持久化平衡树
题目传送门:洛谷P3835. 题意简述: 题面说的很清楚了. 题解: 考虑建立一棵每个节点都表示一个版本的树. 以初始版本 \(0\) 为根.对于第 \(i\) 个操作,从 \(v_i\) 向 \(i ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3835 【模板】可持久化平衡树
题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- luoguP3835 [模板]可持久化平衡树
https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
随机推荐
- Arcpy中Geometry类与Array类转换的陷阱
1.现象说明 使用Arcpy.da.searchcursor得到Geometry,将Geometry转换成Array,再从Array转换回Geometry.若Geometry包含内环,这个过程可能导致 ...
- 多年老项目添加cocoapod管理之后的各种问题解决方案
整个组件化过程中遇到的问题及解决方案原文出处 hehuoya.com pod install 报警告(debug.release..) 解决方案:other link flags : $(inheri ...
- GNU Makefile中的条件控制结构
在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...
- 在 ubuntu 下安装 mono 和 xsp4 ,并测试
1. 安装完 ubuntu 后,在 ubuntu 软件中查看是否自带了 mono 运行时和 XSP4,如果没有,则选中后,点击安装按钮. 2. 安装完后,在终端(类似于 Windows 上的命令行工具 ...
- Java面试-TCP连接及其优化
作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP连接你了解吗?今天我们来仔细看看这个部分. TCP建立连接-三次 ...
- Queue接口分析:add和offer区别,remove和poll方法到底啥区别
Queue接口: public interface Queue<E> extends Collection<E> { /* * add方法,在不违背队列的容量限制的情况,往队列 ...
- SoapException: Timed out while processing web services request
情形:动态调用WebService时,语句method.Invoke异常. 异常信息为调用目标发生异常,从异常信息并不能看出问题所在,需要查看InnerException,如标题所述:处理web请求超 ...
- spring data jpa hql动态查询案例
目的:根据入参条件不同,动态组装hql里的where语句. 1. 实现代码 public List<WrapStatis> queryStatisCriteriaBuilder(Strin ...
- SpringBoot静态资源文件
1.默认静态资源映射 Spring Boot对静态资源映射提供了默认配置 Spring Boot默认将 /** 所有访问映射到一下目录 classpath:/static classpath:/pub ...
- ArrayList集合的
import java.util.ArrayList; /* * 如果想向集合ArrayList中存储基本数据类型,必须使用基本数据类型的“包装类” * * 基本类型 包装类(引用类型,包装类型都位于 ...