BZOJ 3224 普通平衡树
这个是第一份完整的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 普通平衡树的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 普通平衡树(Treap模板题)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14301 Solved: 6208 [Submit][ ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 - 普通平衡树 - [Treap][Splay]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- bzoj 3224 普通平衡树 vactor的妙用
3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- BZOJ 3224 普通平衡树(树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3224 题意:维护以下操作:(1)插入x:(2)删除x(若有多个相同的数,只删除一个)(3 ...
- BZOJ 3224 普通平衡树 | 平衡树模板
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...
- bzoj 3224 裸平衡树
裸的平衡树,可以熟悉模板用,写题写不出来的时候可以A以下缓解下心情. /************************************************************** P ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
随机推荐
- js字符串函数之indexOf()
indexOf 返回字符串中指定字符首次出现的位置 var str="hello, I am Miss bean!"; str.indexOf("l")//结果 ...
- python中字符串与列表的相互转换
列表转字符串 list1 = ['abc' , 'def' , 'ghi'] str1 = ','.join(list1) str1 = '##'.join(list1) 字符串转列表 str1 = ...
- Or
1. 数据库表空间和数据文件 2.关于数据库端口的解析 SQLSever 1433 MySql 3306 Oracle 1521 3.关于listener.ora位置 修改该界面上 ...
- Struts2动态结果(${})and全局结果(global-results)
动态结果 例:根据判定动态结果区分用户进行登录 1.先在TestAction类中进行判定赋值 public class TestAction extends ActionSupport { priva ...
- oracle 里面定时执行任务,比如存储过程内容等
DECLARE job_no_ NUMBER; BEGIN DBMS_JOB.SUBMIT(job_no_, 'proc_qszx_dw_sc(' ...
- [转载]WCF实现双工通信
双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...
- C#基础学习文章导航
第一部分:入个门 C#入门篇-1:HelloWorld的类 C#入门篇-2:什么是变量 C#入门篇-3:数据类型及转换 C#入门篇-4:使用运算符 第二部分:流程控制语句 C#入门篇5-1:流程控制语 ...
- 重点关注之自定义序列化方式(Protobuf和Msgpack)
除了默认的JSON和XML序列化器外,如果想使用其它格式的(比如二进制)序列化器,也是可以的.比如著名的Protobuf和Msgpack,它们都是二进制的序列化器,特点是速度快,体积小.使用方法如下. ...
- 绑定本地Service并与之通信-----之一
import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os. ...
- 0302IT行业就业&软件工程之我所思和所想
阅读以下文章 http://www.thea.cn/news/terminal/9/9389.html http://www.shzhidao.cn/system/2015/09/22/0102610 ...