无旋treap hfq-treap
怎么代码都这么长。。。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<random>
using namespace std;
const int maxn = 1e5+;
struct node{
int l,r;
int val,key;
int size;
}fhq[maxn];
int cnt,root;
std::mt19937 rnd();
inline int newnode(int val)
{
fhq[++cnt].val=val;
fhq[cnt].key=rnd();
fhq[cnt].size=;
return cnt;
}
inline void update(int now)
{
fhq[now].size=fhq[fhq[now].l].size+fhq[fhq[now].r].size+;
}
///分裂
void split(int now,int val,int &x,int &y)
{
///当前节点不存在
if(!now)x=y=;
else
{
///如果当前节点的值是小于val
///那么这个当前节点的左子树也归到val
///我们把x=now相当于把这个点连接到分裂出来比这个值小的树
///然后我们取递归分裂这个树的右子树
///由于当前节点归到了小于的节点 但是这个接待那的右节点仍然需要重建
if(fhq[now].val<=val)
{
x=now;
///右子树还有往下分裂
split(fhq[now].r,val,fhq[now].r,y);
}else { y=now;
split(fhq[now].l,val,x,fhq[now].l);
}
update(now);
}
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
///如果x的索引是大于y
///当前不满足二叉搜索树的形状,那么我们继续合并x的右子树
if(fhq[x].key>fhq[y].key)
{
fhq[x].r=merge(fhq[x].r,y);
update(x);
return x;
}
else
{
fhq[y].l=merge(x,fhq[y].l);
update(y);
return y;
}
}
int x,y,z;
inline void ins(int val)
{
split(root,val,x,y);
root=merge(merge(x,newnode(val)),y);
}
inline void del(int val)
{
split(root,val,x,z);
split(x,val-,x,y);
y=merge(fhq[y].l,fhq[y].r);
root=merge(merge(x,y),z);
}
inline void getrank(int val)
{
split(root,val-,x,y);
printf("%d\n",fhq[x].size+);
root=merge(x,y);
}
inline void getnum(int rank)
{
int now=root;
while(now)
{
if(fhq[fhq[now].l].size+==rank)
break;
else if(fhq[fhq[now].l].size>=rank)
now=fhq[now].l;
else
{
rank-=fhq[fhq[now].l].size+;
now=fhq[now].r;
}
}
printf("%d\n",fhq[now].val);
}
inline void pre(int val)
{
split(root,val-,x,y);
int now=x;
while(fhq[now].r)
now=fhq[now].r;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
inline void net(int val)
{
split(root,val,x,y);
int now = y;
while(fhq[now].l)
now=fhq[now].l;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
int main(){
int t;
int op;
int val;
cnt=;
scanf("%d",&t);
while(t--){
scanf("%d%d",&op,&val);
if (op==){
ins(val);
}else if (op==){
del(val);
}else if (op==){
getrank(val);
}else if (op==){
getnum(val);
}else if (op==){
pre(val);
}else {
net(val);
}
}
return ;
}
无旋treap hfq-treap的更多相关文章
- 【无旋式treap】例题
[bzoj3223]文艺平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[ ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- 无旋treap的区间操作实现
最近真的不爽...一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h... 一道不错的自虐题... 由于这一片主要讲思想,代码我放这里了 不会无旋treap的童鞋可以进这里 呵呵... ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- [BZOJ1588][HNOI2002]营业额统计 无旋Treap
[HNOI2002]营业额统计 时间限制: 5 Sec 内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
随机推荐
- php的FTP操作类
class_ftp.php <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状 ...
- TP5.1 首页路由
把自带的return 删了
- CI框架--浅谈前后台区分
谈到CI框架,这是我第二个用到的框架,初步使用过后,眼前一亮.CI框架上手简单.模式明确.适合新手学习框架时入手. 下面给大家讲讲CI框架区分前后台文件的具体做法: 首先在application文件夹 ...
- PHP加密解密方法
加密解密方法 //字符串解密加密 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_l ...
- StatusBar用法
一.StatusBar组件介绍 StatusBar 是 React Native 0.20 起新增的跨平台组件,它可以用来设置并动态改变设备的状态栏显示特性. StatusBar 组件可以同时加载多个 ...
- 《2019年上半年Web应用安全报告》发布:90%以上攻击流量来源于扫描器,IP身份不再可信
Web应用安全依然是互联网安全的最大威胁来源之一,除了传统的网页和APP,API和各种小程序也作为新的流量入口快速崛起,更多的流量入口和更易用的调用方式在提高web应用开发效率的同时也带来了更多和更复 ...
- qt获取本机ip
//获取本机IP QString getIP(QString localHost) { QString ipAddr; #if 0 QList<QHostAddress> AddressL ...
- PHP核心编程--站内搜索
一. 站内搜索 前台页面: 在index.php页面中添加一个表单,输入搜索框 后台页面: 将index.php另存为search.php 对于搜索的 分页关键代码: 高亮关键字 相关 ...
- cocos2dX 之CCAnimation/CCAnimate
我们今天来学习cocos2dX里面的动画的制作, 有人说, 不是前面CCAction已经学过了吗? 怎么还要学, CCAction是动作, 而我们今天要学的是动画哦, 是让一个东西动起来哦, 好了进入 ...
- JS文字球状放大效果
在线演示 本地下载