【洛谷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个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
随机推荐
- linux 查看用户列表
cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"| ...
- torch_09_GAN
1.生成对抗网络 让两个网络相互竞争,通过生成网络来生成假的数据,对抗网络通过判别器判别真伪,最后希望生成网络生成的数据能够以假乱真骗过判别器 2.生成模型 就是‘生成’样本和‘真实’的样本尽可能的相 ...
- 纯 css 打造一个小提示 tooltip
最后编辑:2019/11/26 前 无意间在寻找资料时候,发现一个不错的小提示,查看源码竟然是纯手工 css 编写(文章底部参考链接). 效果 使用的特性 css2 中的 attr 函数,所以现在(2 ...
- 明解C语言 入门篇 第五章答案
练习5-1 /* 依次把1.2.3.4.5 赋值给数组的每个元素并显示(使用for语句) */ #include <stdio.h> int main(void) { int i; ]; ...
- HTML+css基础 img 标签的属性
img: src=”” src是标签的属性 等号右边是属性值.就是图片的路径. 路径 1. 绝对路径:按照一个路径能找到,具体到某一个盘符下,某一个文件夹内. 2. 相对路径:以当前页面为参考物,去查 ...
- useEffect传入第二个参数陷入死循环
最近新项目刚上手,就用了react的hooks,之前也看过hooks的不少文章,只是还没实战实战. 业务场景1:需要在页面一开始时得到一个接口的返回值,取调用另一个接口. 我的思路是,先设置这个接口的 ...
- C/C++ 随笔目录
[1]基础部分 (1)宏定义 <assert> <offset宏> <#pragma once> <宏定义学习> <预处理语句> <# ...
- django学习_学生信息管理后台
一.功能: 实现对学生对个人信息的增删查改 实现后台对所有学生信息的操作 二.此后台采用的是MVC的风格模式进行编码 1.VIEWS部分 from django.http import HttpRes ...
- 关于Panel隐藏横向滚动条
不设置控件的AutoScroll属性,在后台写代码,就可以隐藏掉横向滚动条
- spring-security.xml——安全性框架配置文件
<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://w ...