增加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 普通平衡树的更多相关文章

  1. 范浩强treap——可持久化

    当平衡树需要可持久化的时候,意味着我们需要访问以前的某个时间点的平衡树,就要保持以前的树形态不变,新建一个时间戳,构建一棵新的树. 如果用以前的旋转treap可能就不方便做到(又要打时间戳,又要新建节 ...

  2. 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...

    初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...

  3. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)

    挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...

  4. C语言学习笔记---谭浩强

    前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...

  5. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  6. C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影

    对指针的概念清晰的话,做这种题只要耐心就行,然而看这种题就烦(被同学吐槽为谭浩强的阴影……草泥马这种C风格题有意义吗?出题人脑子被门夹了?而且C++11都不支持字面值字符串直接转换成char*了.好吧 ...

  7. c++面向对象程序设计 课后题 答案 谭浩强 第四章

    c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...

  8. c++面向对象程序设计 谭浩强 第三章答案

    2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...

  9. c++面向对象程序设计 谭浩强 第二章答案

    类体内定义成员函数 #include <iostream> using namespace std; class Time { public: void set_time(); void ...

随机推荐

  1. 【BZOJ】2049: [Sdoi2008]Cave 洞穴勘测 LCT

    [题意]给定n个点和m个操作,每次操作:1.连接2个点.2.断开2个点.3.查询2个点是否连通.m<=2*10^5. [算法]Link-Cut Tree [题解]LCT模板题,Link,Cut, ...

  2. JavaScript事件和方法

    单击一个超链接触发事件 1.用a标签的onclick <a href="#" onclick="js代码"> 这种写法呢,存在一种弊端,就是点击后会 ...

  3. js和php的时间戳和时间的转化

    js时间戳转化为时间 //时间戳转时间 function time(sj) { var now = new Date(sj*1000); var year =now.getFullYear(); va ...

  4. 【译】Linux提权基础

    英文原文: Basic Linux Privilege Escalation 在开始之前,我想指出 - 我不是专家. 据我所知,在这个巨大的领域没有一个“魔法”的答案. 这只是我的发现,写出来,共享而 ...

  5. react 修改state某一属性值

    1.state // 筛选框相关数据 searchSelect: { term: { value: '学期', key: '', options: [] }, type_of_personnel: { ...

  6. 16级第二周寒假作业E题

    Home_W的位运算4 TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 给 ...

  7. gmail注册时“此电话号码无法用于进行验证”

    网上有几个方法,有说不要改默认地点,有说验证时直接写+86手机号,试了以后还是不行. 我的方法:换成IE浏览器,就可以验证了.

  8. 用C#实现通过串口对设备的数据采集--Server层

    今天中午没睡午觉,头昏眼花的,实在写不了代码,把这几天写的Server层数据采集的程序整理了一下. WatrLevelDataCollectServer.cs using System; using ...

  9. 关于linux系统如何实现fork的研究(一)【转】

    转自:http://www.aichengxu.com/linux/4157180.htm 引言 fork函数是用于在linux系统中创建进程所使用,而最近看了看一个fork()调用是怎么从应用到gl ...

  10. ansible 下lineinfile详细使用 【转】

    转自 ansible 下lineinfile详细使用 - 散人 - 51CTO技术博客http://zouqingyun.blog.51cto.com/782246/1882367 一.简述 这几天在 ...