这个是第一份完整的treap代码。嗯。。。虽然抄的百度的版,但还是不错的。

!bzoj上不能用srand。

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
struct treap
{
int left,right,value;
int fix,w,size;
}tr[100005];
int n,opt,x,ans,root=-1,cnt=0;
void update(int k)
{
tr[k].size=tr[tr[k].left].size+tr[tr[k].right].size+tr[k].w;
}
void lturn(int &k)
{
int t=tr[k].right;
tr[t].size=tr[k].size;
tr[k].right=tr[t].left;
tr[t].left=k;update(k);
k=t;
}
void rturn(int &k)
{
int t=tr[k].left;
tr[t].size=tr[k].size;
tr[k].left=tr[t].right;
tr[t].right=k;update(k);
k=t;
}
void insert(int &k,int x)
{
if (k==-1)
{
cnt++;
tr[cnt].left=-1;tr[cnt].right=-1;
tr[cnt].value=x;tr[cnt].fix=rand();
tr[cnt].w=1;tr[cnt].size=1;k=cnt;
return;
}
tr[k].size++;
if (tr[k].value==x) tr[k].w++;
else if (tr[k].value>x)
{
insert(tr[k].left,x);
if (tr[tr[k].left].fix<tr[k].fix) rturn(k);
}
else
{
insert(tr[k].right,x);
if (tr[tr[k].right].fix<tr[k].fix) lturn(k);
}
}
void del(int &k,int x)
{
if (k==-1) return;
if (tr[k].value==x)
{
if (tr[k].w>1)
{
tr[k].w--;tr[k].size--;
return;
}
if (tr[k].left==-1) k=tr[k].right;
else if (tr[k].right==-1) k=tr[k].left;
else if (tr[tr[k].left].fix<tr[tr[k].right].fix)
{
rturn(k);
del(k,x);
}
else
{
lturn(k);
del(k,x);
}
}
else if (tr[k].value<x)
{
tr[k].size--;
del(tr[k].right,x);
}
else
{
tr[k].size--;
del(tr[k].left,x);
}
}
int rank(int &k,int x)
{
if (k==-1) return 0;
if (tr[k].value==x) return tr[tr[k].left].size+1;
else if (x<tr[k].value) return rank(tr[k].left,x);
else return tr[tr[k].left].size+tr[k].w+rank(tr[k].right,x);
}
int num(int &k,int x)
{
if (k==-1) return 0;
if (x<=tr[tr[k].left].size)
return num(tr[k].left,x);
else if (x>tr[tr[k].left].size+tr[k].w)
return num(tr[k].right,x-tr[tr[k].left].size-tr[k].w);
else return tr[k].value;
}
void pro(int k,int x)
{
if (k==-1) return;
if (tr[k].value<x)
{
ans=k;
pro(tr[k].right,x);
}
else pro(tr[k].left,x);
}
void sub(int k,int x)
{
if (k==-1) return;
if (tr[k].value>x)
{
ans=k;
sub(tr[k].left,x);
}
else sub(tr[k].right,x);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&opt,&x);
switch (opt)
{
case 1:insert(root,x);break;
case 2:del(root,x);break;
case 3:printf("%d\n",rank(root,x));break;
case 4:printf("%d\n",num(root,x));break;
case 5:ans=0;pro(root,x);printf("%d\n",tr[ans].value);break;
case 6:ans=0;sub(root,x);printf("%d\n",tr[ans].value);break;
}
}
return 0;
}

BZOJ 3224 普通平衡树的更多相关文章

  1. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  2. BZOJ 3224 普通平衡树(Treap模板题)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14301  Solved: 6208 [Submit][ ...

  3. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  4. BZOJ 3224 - 普通平衡树 - [Treap][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  5. bzoj 3224 普通平衡树 vactor的妙用

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  6. BZOJ 3224 普通平衡树(树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3224 题意:维护以下操作:(1)插入x:(2)删除x(若有多个相同的数,只删除一个)(3 ...

  7. BZOJ 3224 普通平衡树 | 平衡树模板

    #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...

  8. bzoj 3224 裸平衡树

    裸的平衡树,可以熟悉模板用,写题写不出来的时候可以A以下缓解下心情. /************************************************************** P ...

  9. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

随机推荐

  1. 菜单滑动-menu swipe

    http://tympanus.net/codrops/ http://www.idangero.us/sliders/swiper/index.php //触摸滑动

  2. wiki-editor语法

    1.==标题== 2.::换行缩进 3.[[文件:example.png]] 图片 4.** 名字|名字 链接

  3. linux开关端口问题

    linux开关端口问题: 我们知道一些常用的端口,比如mysql的端口为3306,sql的端口为:1433,以及tomcat的端口为 8008等等一样! 当这些端口在linux下是没有开启时,我们是无 ...

  4. 定向转发和重定向实现 <select >下拉表单数据传送

    定向转发的特点:   (1). 实行转发时浏览器上的网址不变  (如果你这点忽视了,那你就要接受我无尽的鄙视吧! 哇咔咔~~~)    (2). 实行转发时 :   只有一次请求.  不信,看这下面的 ...

  5. 超棒的响应式设计测试书签和工具(bookmarks)(转)

    一.测试书签(bookmarks) Viewport Resizer 这个书签号称拥有158个国家3万多活跃的用户,主要特性: 完全自定制 方便的添加自定义尺寸 手动的横竖屏切换 自动的横竖屏切换 ( ...

  6. go局部变量的存储空间是堆还是栈?

    编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的. var global *int func f() { var x ...

  7. Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)

    Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办 ...

  8. log4j的简单应用(转载)

    当程序有错误时,我们就需要找出错误的地方并进行验证,怎样才能准确快速的找到出错的地方呢,那就是在程序运行时在控制台上输出相关的信息,从而可以判断程序的运行顺序以及出错的位置.以前总是习惯使用Syste ...

  9. js控制html元素的readonly属性

    html元素假设为只读,那么其readonly="readonly",我们现在想通过js来改变readonly属性为可以输入. 初始时,两个输入框都是只读.点击change按钮后, ...

  10. [js]多个物体的运动

    与单个的区别:得知道哪个在动,所以运动函数需要两个参数,出了目标iTarget之外,还要obj.另外需要多个计数器,否则当一个还没运动完就移入另一个物体会发生卡壳 window.onload=func ...