$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. [JZOJ]2109 清兵线 题解

    ## [JZOJ]2109 清兵线 题解 **FIRST 题目大意** 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m- ...

  2. __declspec(dllexport)和__declspec(dllimport) (——declspec方法创建dll的方法已验证ok)

    转载:https://www.cnblogs.com/chengbing2011/p/4084125.html __declspec(dllimport)和__declspec(dllexport)经 ...

  3. matlab中find 查找非零元素的索引和值

    来源:https://ww2.mathworks.cn/help/matlab/ref/find.html?searchHighlight=find&s_tid=doc_srchtitle f ...

  4. 二进制部署Redis-5.07

    Redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类 ...

  5. VBScript 教程

    VBScript 教程 VB 不区分大小写 变量 普通变量 关键词声明 Dim.Public.Private 赋值动态创建 name = "hello" Option Explic ...

  6. 实验三  平面广告制作工具Photoshop基础--制作LOGO

    实验三  平面广告制作工具Photoshop基础--制作LOGO [实验目的] ⑴.熟悉Photoshop的界面 ⑵.能利用photoshop处理简单的图像 [实验条件] ⑴.个人计算机一台 ⑵.个人 ...

  7. MeteoInfoLab脚本示例:合并数组

    对于全球数据来说,经度要么是-180 - 180,要么是0 - 360,都会存在边界数据不连续的问题.比如0 - 360的数据,怎么得到 -20 - 30度的连续格点数据就是个问题(跨越了数据的经度边 ...

  8. ssh登录二次验证,让服务器更安全。

    码云地址 sshdTwoVerification 介绍 ssh登录二次验证 问题:现在很多人的Linux服务器可能会被攻击,只校验一次后台用户名密码登录变得不再保险. 当然大家首先要做的是修改ssh服 ...

  9. vagrantfile-参考示例

    Vagrantfile 文件  bt为你需要新建的box名字    Vagrant.configure("2") do |config|   config.vm.box = &qu ...

  10. 测试之-Jmeter使用

    一. 修改语言 修改 在 bin 目录下的 Jemeter.properties 二 . Jmeter主要元件 1.测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器 ...