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 ...
随机推荐
- 用excel处理重复数据
我们在处理数据时,重复数据常常会对分析造成很大麻烦,因此数据整理初期一个重要的工作是排重,excel2007以上版本中有一个删除重复项功常便捷,但是每次点来点去也很麻烦,下面我们用公式来对一些重复数据 ...
- hdu 3908 Triple(组合计数、容斥原理)
Triple Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- C#多态问题
为什么对这个感觉趣呢.因为以前写过两篇关于这个多态和重载混合起来很乱的调用情况分析,自从哪以后,我自认为随便乱写一些继承多态的代码都应该难不到我.但是今天看到一段代码有一个地方计算错误了,所以有必要写 ...
- js仿京东轮播图效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 一般处理文件.ashx中使用文件session遇到的问题
在给其他网站提供接口的时候用ashx做的,在文件调用cs中的方法,方法中的Session报错:System.NullReferenceException: 未将对象引用设置到对象的实例. /// &l ...
- c# 调用 ShellExecute
using System.Runtime.InteropServices; namespace ConsoleTest{ class Program { public enu ...
- HTML内容整理
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- hdu 4632 Palindrome subsequence
http://acm.hdu.edu.cn/showproblem.php?pid=4632 简单DP 代码: #include<iostream> #include<cstdio& ...
- 2.4.2电子书fb.c文件
显示层面头文件 定义结构体,为显示统一标准 int (*DeviceInit)(void); 显示类驱动初始化 int (*ShowPixel)(int iPenX, int iPenY, unsig ...