$Fhq$ $treap$

#include <bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int n,root,t;
struct node
{
int val,key,si,son[2],g;
}sh[MAXN];
deque <int> q;
int newnode(int v)
{
t++;
sh[t].si=sh[t].g=1;
sh[t].val=v;
sh[t].key=rand();
return t;
}
void pushup(int x)
{
sh[x].si=sh[x].g+sh[sh[x].son[0]].si+sh[sh[x].son[1]].si;
}
void split(int now,int k,int &x,int &y)
{
if (now==0)
{
x=y=0;
return;
}
if (sh[now].val<=k)
{
x=now;
split(sh[now].son[1],k,sh[now].son[1],y);
}
else
{
y=now;
split(sh[now].son[0],k,x,sh[now].son[0]);
}
pushup(now);
}
int merge(int x,int y)
{
if (x==0)
return y;
if (y==0)
return x;
if (sh[x].key<sh[y].key)
{
sh[x].son[1]=merge(sh[x].son[1],y);
pushup(x);
return x;
}
else
{
sh[y].son[0]=merge(x,sh[y].son[0]);
pushup(y);
return y;
}
}
int kth(int now,int k)
{
if (sh[sh[now].son[0]].si<k && k<=sh[sh[now].son[0]].si+sh[now].g)
return now;
else
if (k<sh[sh[now].son[0]].si+sh[now].g)
return kth(sh[now].son[0],k);
else
return kth(sh[now].son[1],k-sh[sh[now].son[0]].si-sh[now].g);
}
int find(int x)
{
q.clear();
int cur;
cur=root;
while (sh[cur].son[x>sh[cur].val]!=0 && sh[cur].val!=x)
q.push_back(cur),cur=sh[cur].son[x>sh[cur].val];
q.push_back(cur);
return cur;
}
void updata()
{
while (!q.empty())
{
pushup(q.back());
q.pop_back();
}
}
int main()
{
srand(time(0));
root=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,op;
scanf("%d%d",&op,&x);
if (op==1)
{
int cur=find(x);
if (sh[cur].val==x)
{
sh[cur].g++;
updata();
}
else
{
int a,b;
split(root,x,a,b);
root=merge(merge(a,newnode(x)),b);
}
}
if (op==2)
{
int cur=find(x);
sh[cur].g--;
updata();
if (sh[cur].g==0)
{
int a,b,c;
split(root,x,a,b);
split(a,x-1,a,c);
c=merge(sh[c].son[0],sh[c].son[1]);
root=merge(merge(a,b),c);
}
}
if (op==3)
{
int a,b;
split(root,x-1,a,b);
printf("%d\n",sh[a].si+1);
root=merge(a,b);
}
if (op==4)
{
printf("%d\n",sh[kth(root,x)].val);
}
if (op==5)
{
int a,b;
split(root,x-1,a,b);
printf("%d\n",sh[kth(a,sh[a].si)].val);
root=merge(a,b);
}
if (op==6)
{
int a,b;
split(root,x,a,b);
printf("%d\n",sh[kth(b,1)].val);
root=merge(a,b);
}
}
}

模板——Fhq_treap的更多相关文章

  1. 「模板」 FHQ_Treap 区间翻转

    「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...

  2. 「模板」 FHQ_Treap

    「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...

  3. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  4. fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树

    题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...

  5. [note]fhq_treap

    fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠 ...

  6. [luogu 3369]普通平衡树(fhq_treap)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  7. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap

    P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...

  8. 浅谈无旋treap(fhq_treap)

    一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...

  9. Luogu P3835 【模板】可持久化平衡树(fhq Treap)

    P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...

随机推荐

  1. 刷LeetCode的简易姿势

    近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...

  2. 持续集成工具之Jenkins安装部署

    一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...

  3. 【C语言编程学习笔记】利用462字节代码实现雅虎logo ACSII 动画!

    ACSII 动画演示:   不过本文介绍的是另一个作品:c 代码实现雅虎 logo ACSII 动图. 运行后,你将会看到:   它是一个 20fps.抗锯齿的 Yahoo! logo ASCII 动 ...

  4. docker19.03搭建私有容器仓库

    一,启动docker后,搜索registry [root@localhost source]# systemctl start docker [root@localhost source]# dock ...

  5. Windows和Mac两种操作系统下CSS不兼容问题的解决

    这两天碰到一个问题,就是一个小图标的大小和定位的位置在不同的操作系统下是不一样的. 查了下资料,自己解决出来了,整理如下: html: <i :class="['cursor-poin ...

  6. vue知识点10

    今天彻底掌握了如下: 1.解决回调地狱三种方案        callback async await Promise 2.中间件(middleware)        express.static  ...

  7. Anderson《空气动力学基础》5th读书笔记 第0记——白金汉PI定理

    目录 量纲分析:白金汉PI定理 相似参数 量纲分析:白金汉PI定理 在空气动力学中,飞机的空气动力主要由自由来流的密度ρ∞,自由来流数V∞,翼弦长度c,自由来流的粘性系数μ∞以及音速a∞,所以假设我们 ...

  8. Nacos配置中心使用

    在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...

  9. 小白也能看懂的JVM内存区域

    前言 最近在准备面试题刷到了JVM这块,作为一个小白,巩固知识点最好的方式就是亲手写出来并分享:相信我的理解,同样是小白的你,一定有很大的帮助.不信,请你往下看! JVM内存区域简介 如果有人问Jav ...

  10. nginx给consul集群配置负载均衡

    upstream consul { server 127.0.0.1:8501; server 127.0.0.1:8502; server 127.0.0.1:8503; } server { li ...