这个是第一份完整的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. 定向转发和重定向实现 <select >下拉表单数据传送

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

  2. OC 实例方法和类方法区别

         Objective-C里面既有实例方法也类方法.类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method).工 ...

  3. <spring:message> 标签

    可以使用<spring:message>标签结合 ResourceBundleMessageSource 的功能,在网页上显示 messages.properties 中的文字讯息,例如在 ...

  4. URL和搜索引擎优化

    URL要短:谷歌的算法是给5个以后的单词更少的权重 URL不含和少含问号:防止死循环 小写字母:搜索引擎遵守HTTP规范,区分大小写.

  5. Objective-C:@property参数详解

    格式:@property(param1, param2) 类型 属性名 参数可有可无 三类参数: 1.读写属性:readwrite/readonly readwrite:产生setter\getter ...

  6. ajax简单封装

    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); ...

  7. Linux的五个查找命令(find、locate、whereis、which、type)

    1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...

  8. TableLayout练习

    <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" ...

  9. dos.orm学习地址

    os.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内.Net用户量最多.最活跃.最完善的国产ORM.初期开发过程参考了NBear与MySo ...

  10. soap

    sudo apt-get update apt-get install php-soapphp-config --configure-options --enable-soap php -i | gr ...