【洛谷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个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
 
随机推荐
- Qt 操作SQLite数据库
			
项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...
 - 【springboot】【jasypt】加密密码
			
springboot的版本是 Spring Boot :: (v2.1.5.RELEASE) 依赖 <dependency> <groupId>com.github.ulise ...
 - scala的应用--UDF:用户自定义函数
			
在window10下安装了hadoop,用ida创建maven项目. <properties> <spark.version>2.2.0</spark.version&g ...
 - 深入浅出 REST(转)
			
文章讲的不错,更具体一些,对实践的指导意义更强 原文:https://www.infoq.cn/article/rest-introduction/ 不知你是否意识到,围绕着什么才是实现异构的应用到应 ...
 - WPF布局介绍(1)
			
开局一张图,内容全靠...,本系列的文章, 主要针对刚入门.亦或是从 winform/bs转过来的开发人员快速入门的指南, 相对于其它一些文章中会详细的从项目如何建立到其实现的原理及组成部分, 本系列 ...
 - golang下载图片,而非预览
			
1 前言 网上查询使用html5,a增加属性download和使用表单get,post提交,都是只能预览,根本原因是返回值需要加入头 w.Header().Add("Content-Type ...
 - codeforces #577(Div.2)
			
codeforces #577(Div.2) A Important Exam A class of students wrote a multiple-choice test. There are ...
 - 基于Custom-metrics-apiserver实现Kubernetes的HPA(内含踩坑)
			
前言 这里要说一下Prometheus的检控指标从哪里来,它有3个渠道: 主机监控,也就是部署了Node Exporter组件的主机,它以DaemonSet或者系统进程的形式运行,Prometheus ...
 - MYSQL中IN,INSTR,FIND_IN_SET函数效率比较(转)
			
今天写代码时前台传过来类似‘1,2,3,4,5,6’的字符串,这种情况直接用IN是无效的,需要把字符串分割成数组或者组装成列表,然后再利用mabatis的foreach函数 <select id ...
 - 理解AMD ,CMD,CommonJS规范
			
https://blog.csdn.net/xcymorningsun/article/details/52709608 理解AMD ,CMD,CommonJS规范 2016年09月30日 10:33 ...