【洛谷P3835】 【模板】可持久化平衡树
时间:2019-12-19
本文章向大家介绍【洛谷P3835】 【模板】可持久化平衡树,主要包括【洛谷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(t[x].ran<t[y].ran) { 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; }
原文地址:https://www.cnblogs.com/guangheli/p/12066038.html
- Quartz.net通过配置文件来完成作业调度
- JavaScript 基础(一)
- 我也来说说.net开源
- 是时候对员工进行网络安全培训了:黑客正将目标瞄准打印机
- 进度条ProgressBar
- Microsoft Visual Studio International Pack
- 柯洁5冠在手“食言”再战AI:我已看开 输赢无所谓
- JGulp: 利用Gulp 配置的前端项目自动化工作流
- 微软Enterprise Library 4.0将支持依赖注入
- 时钟AnalogClock与DigitalClock
- 细数那些在2017年被黑客滥用的系统管理工具和协议
- Compass: 在你的应用中集成搜索功能
- 列表选择Spinner
- 巧用CSS3 :target 伪类制作Dropdown下拉菜单(无JS)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅析 JavaScript 中的事件委托
- Java|继承学习总结
- 常用功能加载宏——一个工作簿的工作表另存为工作簿
- VBA使用API_03:创建窗体
- Jackson 反序列化远程代码执行漏洞复现
- MyVBA加载宏——添加自定义菜单01
- JavaScript|计算字符串的字节数
- 7个处理JavaScript值为undefined的技巧
- Python|快速排序
- 如何判断一个网页是列表页还是详情页
- 小游戏:围住神经猫
- JAVA|Java方法的使用
- VBA解压缩ZIP文件06——Huffman树码表
- 精品连载丨安卓 App 逆向课程之五 frida 注入 Okhttp 抓包下篇
- Excel VBA常用功能加载宏——工作表隐藏