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. 【Python笔记】2020年7月30日练习【汉诺塔游戏】

    学习教程:廖雪峰-Python教程-函数-递归函数 学习笔记: 实例代码如下: def move(n, a, b, c): if n == 1: print(a,'--->', c) else: ...

  2. docker镜像,容器的操作和应用

    镜像操作 拉取镜像 从中央仓库拉取到本地 docker pull 镜像名称[:tag] #举个例子 :docker pull daocloud.io/libarary/tomcat:8.5.-jre8 ...

  3. git使用-远程仓库(github为例)

    1.登录github(没有先注册账号) 2.settings>SSH and GPG keys>New SSH key Title(自己填写即可) key需要git命令生成 ssh-key ...

  4. SpringBoot进阶教程(六十三)Jasypt配置文件加密

    数据库密码直接明文写在配置中,对安全来说,是一个很大的挑战.一旦密码泄漏,将会带来很大的安全隐患.尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密.本文着重介绍Jasypt对Sprin ...

  5. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  6. Android开发进程0.1 轮播图 Scrollview Fragment

    轮播图的实现 轮播图通过banner可以较为便捷的实现 1.添加本地依赖,在dependence中搜索相关依赖 2.添加banner的view组件 3.创建适配器GlideImageLoader ex ...

  7. JS实例—DOM的增删改

    <!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...

  8. PYTHON-错误-函数有返回值未接收导致替换不成功

    #1.有返回值,没有赋值,替换不成功 cxj = 'guapi' cxj.replace(cxj,'2b') print(cxj) #2.有返回值,赋值,替换成功 cxj = 'guapi' cxj ...

  9. Python3 执行JS出现JSON未定义问题

    two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...

  10. SpringSecurity权限管理系统实战—四、整合SpringSecurity(上)

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...