非旋Treap——fhq treap
https://www.luogu.org/problemnew/show/P3369
知识点:1.拆分split,合并merge
2.split,merge要点:通过传址调用来简便代码
3.记得root = merge(xxxxx,xxxxx);
2 wrong in code
#include <bits/stdc++.h>
#define M 200002
using namespace std;
int tot = ;
int val[M],rd[M];
int ch[M][];
int root = ;
int m;
int siz[M];
int newnode(int x)
{
siz[++tot] = ;
val[tot] = x;
rd[tot] = rand();
return tot;
}
void updata(int x)
{
siz[x] = siz[ch[x][]] + siz[ch[x][]] + ;
}
void split(int now,int k,int &x,int &y)
{
if(!now)
{
x = y = ;
return;
}
else
{
if(val[now] <= k)
{
x = now;
split(ch[now][],k,ch[now][],y);
}
else
{
y = now;
split(ch[now][],k,x,ch[now][]);
}
updata(now);
}
}
int merge(int A,int B)
{
if(!A || !B) return A + B;
if(rd[A] < rd[B]){ch[A][] = merge(ch[A][],B); updata(A); return A;}
else {ch[B][] = merge(A,ch[B][]); updata(B); return B;}
}
void insert(int t)
{
int x,y;
split(root,t,x,y);
root = merge(merge(x,newnode(t)),y);
}
void del(int t)
{
int x,y,z;
split(root,t,x,z);
split(x,t - ,x,y);//wrong 1:是 split(x,t - 1,x,y)而不是 split(root,t - 1,x,y)
y = merge(ch[y][],ch[y][]);//wrong 2: 记得y =
root = merge(merge(x,y),z);
}
int findrk(int t)
{
int x,y;
split(root,t - ,x,y);
int ans = siz[x] + ;
root = merge(x,y);
return ans;
}
int kth(int now,int k)
{
while(now)
{
if(k <= siz[ch[now][]]) now = ch[now][];
else if(k == siz[ch[now][]] + ) return now;
else k -= siz[ch[now][]] + ,now = ch[now][];
}
return now;
}
int front(int k)
{
int x,y;
split(root,k - ,x,y);
int ans = val[kth(x,siz[x])];
root = merge(x,y);
return ans;
}
int back(int k)
{
int x,y;
split(root,k,x,y);
int ans = val[kth(y,)];
root = merge(x,y);
return ans;
}
int main()
{
srand();
scanf("%d",&m);
int x,y;
while(m--)
{
scanf("%d%d",&x,&y);
if(x == )
{
insert(y);
}
if(x == )
{
del(y);
}
if(x == )
{
printf("%d\n",findrk(y));
}
if(x == )
{
printf("%d\n",val[kth(root,y)]);
}
if(x == )
{
printf("%d\n",front(y));
}
if(x == )
{
printf("%d\n",back(y));
}
}
return ;
}
非旋Treap——fhq treap的更多相关文章
- 非旋treap (fhq treap) 指针版
传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...
- 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
简介: Treap,一种表现优异的BST 优势: 其较于AVL.红黑树实现简单,浅显易懂 较于Splay常数小,通常用于树套BST表现远远优于Splay 或许有人想说S ...
- 「学习笔记」 FHQ Treap
FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- 可持久化treap(FHQ treap)
FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...
- 非旋(fhq)Treap小记
前置知识:二叉搜索树 以下摘自 ↑: 二叉搜索树每次操作访问O(深度)个节点. 在刻意构造的数据中,树的形态会被卡成一条链,于是复杂度爆炸 它的复杂度与直接暴力删除类似. 但二叉搜索树扩展性强.更复杂 ...
- 关于非旋FHQ Treap的复杂度证明
非旋FHQ Treap复杂度证明(类比快排) a,b都是sort之后的排列(从小到大) 由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的. 由一个排列b构造一 ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- 非旋 treap 结构体数组版(无指针)详解,有图有真相
非旋 $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ ...
随机推荐
- NIO(三):Selector选择器
一.堵塞式与非堵塞式 在传统IO中,将数据由当前线程从客户端传入服务端,由服务端的内核进行判断传过来的数据是否合法,内核中是否存在数据. 如果不存在数据 ,并且数据并不合法,当前线程将会堵塞等待.当前 ...
- 又一个小而美的Java Web框架: Solon!
Solon 是Java世界里一个新的极易上手的Web框架.参考过 Javalin . Spring 等很多现有框架的设计. 取名自海贼王里的角色,说是希能像他一样能打 小.真的是小.最小的运行单位只有 ...
- Vuex mapState的基本使用
mapState把Store中的state映射到组件中的计算属性 Store文件 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) ...
- Vue 内联模板(inline-template)
内联模板不会把子组件的内容分发渲染到父组件中 而是需要在父组件中实现其内容的渲染 父组件 <template> <div> <template-inline inline ...
- 报错:无效的列类型: 1111;must be specified for all nullable parameters.
org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers ...
- clients-producer-组包发送消息
- JMX基本概念
Object name的语法 形似 com.sun.someapp:type=Whatsit,name=25 com.sun.someapp 是domain,冒号后面的是key-property-li ...
- SVN的基本使用
2020年7月6日 为什么需要版本控制? 需要清晰地保存某些文件的不同修订版本 控制文件的发屐过程,找出导致 BUG 的原因 轻松将项目或文件恢复到指定版本 极大方便团队之间协同开发,防止出现混乱 在 ...
- 微信DLL劫持反弹shell复现
(该文参考网络他人资料,仅为学习,不许用于非法用途) 一.操作环境 Windows7 : 微信 , Process Explorer(任务管理工具,本实验中用于查找微信程序调用的DLL文件) Ka ...
- 【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察
摘要: 老大说,我这份用关键词抽取API搞定的用户需求洞察报告,简直比比市场调研的科班人士做得还好. 最近这半个月的午饭,那可是相当不错,市场老大天天请吃饭,不是外面下馆子,就是从家带饺子.说是感谢我 ...