范浩强treap 普通平衡树
增加Split(分裂),Merge(合并)操作,非常好写,时间也不比普通treap慢什么。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r;int size,rnd,v;
}t[*];
int cnt,rt[];
void update(int k)
{
t[k].size=t[t[k].l].size+t[t[k].r].size+;
}
void newnode(int &k,int x)
{
t[k=++cnt].v=x;t[k].size=;t[k].rnd=rand();
}
int merge(int a,int b)
{
if(!a||!b)return a+b;
if(t[a].rnd>t[b].rnd)
{
int p=++cnt;t[p]=t[a];
t[p].r=merge(t[p].r,b);
update(p);
return p;
}
else
{
int p=++cnt;t[p]=t[b];
t[p].l=merge(a,t[p].l);
update(p);
return p;
}
}
void split(int now,int k,int &x,int &y)
{
if(!now)x=y=;
else
{
if(t[now].v<=k)
{
x=++cnt;t[x]=t[now];
split(t[x].r,k,t[x].r,y);
update(x);
}
else
{
y=++cnt;t[y]=t[now];
split(t[y].l,k,x,t[y].l);
update(y);
}
}
}
void Delete(int &root,int w)
{
int x=,y=,z=;
split(root,w,x,z);
split(x,w-,x,y);
y=merge(t[y].l,t[y].r);
root=merge(merge(x,y),z);
}
void Insert(int &root,int w)
{
int x=,y=,z=;
split(root,w,x,y);
newnode(z,w);
root=merge(merge(x,z),y);
}
int getval(int k,int w)
{
if(w==t[t[k].l].size+)return t[k].v;
else if(w<=t[t[k].l].size)return getval(t[k].l,w);
else return getval(t[k].r,w-t[t[k].l].size-);
}
int getkth(int &root,int w)
{
int x,y;
split(root,w-,x,y);
int ans=t[x].size+;
root=merge(x,y);
return ans;
}
int getpre(int &root,int w)
{
int x,y,k,ans;
split(root,w-,x,y);
if(!x)return -;
k=t[x].size;
ans=getval(x,k);
root=merge(x,y);
return ans;
}
int getnex(int &root,int w)
{
int x,y,ans;
split(root,w,x,y);
if(!y)return ;
else ans=getval(y,);
root=merge(x,y);
return ans;
}
int main()
{
int n,f,w,tim;
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d%d%d",&tim,&f,&w);
rt[i]=rt[tim];
if(f==)Insert(rt[i],w);
else if(f==)Delete(rt[i],w);
else if(f==)printf("%d\n",getkth(rt[i],w));
else if(f==)printf("%d\n",getval(rt[i],w));
else if(f==)printf("%d\n",getpre(rt[i],w));
else printf("%d\n",getnex(rt[i],w));
}
return ;
}
范浩强treap 普通平衡树的更多相关文章
- 范浩强treap——可持久化
当平衡树需要可持久化的时候,意味着我们需要访问以前的某个时间点的平衡树,就要保持以前的树形态不变,新建一个时间戳,构建一棵新的树. 如果用以前的旋转treap可能就不方便做到(又要打时间戳,又要新建节 ...
- 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...
初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...
- 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)
挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...
- C语言学习笔记---谭浩强
前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影
对指针的概念清晰的话,做这种题只要耐心就行,然而看这种题就烦(被同学吐槽为谭浩强的阴影……草泥马这种C风格题有意义吗?出题人脑子被门夹了?而且C++11都不支持字面值字符串直接转换成char*了.好吧 ...
- c++面向对象程序设计 课后题 答案 谭浩强 第四章
c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...
- c++面向对象程序设计 谭浩强 第三章答案
2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...
- c++面向对象程序设计 谭浩强 第二章答案
类体内定义成员函数 #include <iostream> using namespace std; class Time { public: void set_time(); void ...
随机推荐
- 自己封装的ASP.NET的MYSQL的数据库操作类
/** * 作者:牛腩 * 创建时间:2010年3月7日17时35分 * 类说明:对MYSQL数据库的操作类 */ using System; using System.Data; using MyS ...
- 【BZOJ】1572: [Usaco2009 Open]工作安排Job
[题意]给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值.n<=10^5. [算法]贪心+堆 [题解] 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为 ...
- 【CodeForces】790 C. Bear and Company 动态规划
[题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...
- 【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2
[题意]数列满足an=an-1+an-2,n>=3.现在a1=i,a2=[l,r],要求满足ak%p=m的整数a2有多少个.10^18. [算法]数论(扩欧)+矩阵快速幂 [题解]定义fib(i ...
- 写一个简易web服务器、ASP.NET核心知识(4)
前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...
- 数据库-SQLite
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 数据库-SQLite 技术博客http:// ...
- Django(基础篇)
1.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交: 提交 -> url > 函数或类中的方法 ...
- php常用代码段
点击换验证码 <a href=" src="{:U('Reglog/vcode')}" /></a> TP上一条下一条 $prev=$artica ...
- 【Python学习】使用BeautifulSoup解析HTML
对于一个最简单的爬虫结构的代码是这样的. 也就是抓取出整个页面,然后创建一个BeautifulSoup对象. from urllib.request import urlopen from bs4 i ...
- C++中string.find()函数,string.find_first_of函数与string::npos
查找字符串a是否包含子串b,不是用strA.find(strB) > 0而是strA.find(strB) != string:nposstring::size_type pos = strA. ...