模板——Fhq_treap
$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的更多相关文章
- 「模板」 FHQ_Treap 区间翻转
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...
- 「模板」 FHQ_Treap
「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)
题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
- [note]fhq_treap
fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠 ...
- [luogu 3369]普通平衡树(fhq_treap)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
随机推荐
- Spring Boot 第六弹,拦截器如何配置,看这儿~
持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是拦截器? 如何自定义一个拦截器? 如何使其在Spring Boot中生效? 举个栗子 思路 根据什么判断这个接口已经 ...
- JavaScript reduce()的使用
语法 arr.reduce(callback(accumulator, currentValue, index, array), initialValue) 参数 callback 执行数组中每个值 ...
- apt-get 安装软件时出现:“文件尺寸不符” 问题
报错信息 命中:1 http://packages.deepin.com/deepin panda InRelease 命中:2 http://linux.teamviewer.com/deb sta ...
- Windows7 组策略错误:“未能打开这台计算机上的组策略对象。您可能没有合适的权限。”
在 Windows 7 系统下,打开组策略时,出现 组策略错误 -- "未能打开这台计算机上的组策略对象.您可能没有合适的权限.".如下图所示: 解决方案: 1.进入"计 ...
- 【linux】基础命令一
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mount dir[] device[]umount devic[]maste ...
- 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...
- std::hash
std::hash 由于C++11引入了哈希表数据结构std::unordered_map和std::unordered_set,所以对于基本类型也实现了标准的哈希函数std::hash,标准并没有规 ...
- spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)
一,为什么要使用分布式session? HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题, 所以我们在创建web集群时,把session保存到r ...
- docker19.03使用数据卷
一,查看当前的docker版本 [root@localhost data]# docker --version Docker version 19.03.8, build afacb8b 说明:刘宏缔 ...
- Java9系列第6篇-Stream流API的增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...