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的更多相关文章

  1. 非旋treap (fhq treap) 指针版

    传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...

  2. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)

    简介:     Treap,一种表现优异的BST 优势:     其较于AVL.红黑树实现简单,浅显易懂     较于Splay常数小,通常用于树套BST表现远远优于Splay     或许有人想说S ...

  3. 「学习笔记」 FHQ Treap

    FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...

  4. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  5. 可持久化treap(FHQ treap)

    FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...

  6. 非旋(fhq)Treap小记

    前置知识:二叉搜索树 以下摘自 ↑: 二叉搜索树每次操作访问O(深度)个节点. 在刻意构造的数据中,树的形态会被卡成一条链,于是复杂度爆炸 它的复杂度与直接暴力删除类似. 但二叉搜索树扩展性强.更复杂 ...

  7. 关于非旋FHQ Treap的复杂度证明

    非旋FHQ Treap复杂度证明(类比快排) a,b都是sort之后的排列(从小到大) 由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的. 由一个排列b构造一 ...

  8. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  9. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

随机推荐

  1. Spring Cloud 系列之 ZooKeeper 注册中心

    什么是注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串.路由信息等.服务注册中心是微服务架构中最基础的设施之一. 注册中心可以说 ...

  2. XCTF-WEB-高手进阶区-upload1-笔记

    这道题摸索着弄出了两种解法 思路大体都是跳过前端的后缀名过滤从而达到上传一句话木马的目的,之后使用菜刀&蚁剑来进行链接获取Flag <script type="text/jav ...

  3. JS学习第八天

    DOM访问列表框.下拉菜单的常用属性: form返回列表框.下拉菜单所在的表单对象; length返回列表框.下拉菜单的选项个数; options返回列表框.下拉菜单里所有选项组成的数组; defau ...

  4. mysql基础测试题

    mysql基础测试题:https://www.cnblogs.com/wupeiqi/articles/5729934.html 如何创建表? 就这样类推?如何提取我们想要的元素呢? 综合提取呢?

  5. 学长小清新题表之UOJ 31.猪猪侠再战括号序列

    学长小清新题表之UOJ 31.猪猪侠再战括号序列 题目描述 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫\(\_CallMeGGBond\). 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领 ...

  6. 每天都在用String,你真的了解吗?

    1.String概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例 String 中包括用于检查各个 ...

  7. 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3

    @ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...

  8. Android app启动出现白屏闪屏

    出现白屏闪屏原因: 进入到AppStartActivity,但是未加载到布局文件,就先显示了窗口的背景,白屏就是显示的windows的背景,即所设置的theme. onCreate()中的setCon ...

  9. 使用Postman工具做接口测试(五)——生成随机参数

    引言 我们平时使用最多的接口调试工具就是postman了,比如开发将一个接口给到你,你想看看接口是否正常.最常用的方法就是用postman去调一下.如果通,就写接口测试用例,反之,将开发打一顿吧o(* ...

  10. QT下载速度慢的解决方法

    在官网的下载速度实在太慢了 找到了一个镜像网站 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/