$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. MacOS如何正确配置Idea自带Maven插件的环境变量?(亲测)

    背景 安装了IDEA开发工具,想执行Maven的命令.但是又没有通过自己下载Maven的安装包进行安装,只是想直接使用IDEA自带的Maven插件来执行Maven的各种命令.由于刚开始使用macos对 ...

  2. K8S-ETCD数据库备份与恢复

    kubernetes使用etcd数据库实时存储集群中的数据,安全起见,一定要备份 需要指定使用etcdctl的版本 etcd数据库备份是使用数控快照的方式进行备份的,备份后的新数据不会保留,后面创建的 ...

  3. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

  4. kubernetes-集群架构与组件

    1. kubernetes集群架构 2. kubernetes组件  1) master组件 kube-apiserver Kubernetes API,集群的统一入口,各组件协调者,以RESTful ...

  5. Windows VS Code 配置 C/C++ 开发环境

    准备 Windows [这个相信大家都有 笑: )] VS Code MinGW-w64 C/C++ 安装 MinGw-w64 具体说明细节和安装体验可以在<⑨也懂系列:MinGW-w64安装教 ...

  6. C++调用全局函数与类成员函数

    void testfunc(void *param) { printf("\n\tcall global function %s\n", param); } void *GetCl ...

  7. mysql DISTINCT选取多个字段,获取distinct后的行信息

    背景:      a表保存关联关系,通过ACode 获取该关系中的所有 BCode, 并获取所有Bcode-max(Bvrsn)的信息  Bnm 表a 表b          循序渐进:        ...

  8. 多测师讲解接口 _需求文档(用户增删改查)_高级讲师肖sir

    首先连接Duoceshi_new网络 密码为Duoceshi_new,因为接口项目部署在Duoceshi_new网段中. 测试工具:postman域名:http://192.168.1.2:8081/ ...

  9. 树状数组(BIT)—— 一篇就够了

    树状数组(BIT)-- 一篇就够了 前言.内容梗概 本文旨在讲解: 树状数组的原理(起源,原理,模板代码与需要注意的一些知识点) 树状数组的优势,缺点,与比较(eg:线段树) 树状数组的经典例题及其技 ...

  10. MeteoInfoLab脚本示例:Hamawari-8 netCDF data

    示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...