3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 14301  Solved: 6208
[Submit][Status][Discuss]

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

HINT

1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]

题目链接:BZOJ 3224

刚学了一下treap,照着模版和自己的理解,果然数据结构很多都是码农题……可以发现treap就是一颗在插入和删除操作的时候会进行一些平衡调整的BST,就当是treap练手题了。

这题用离线下的离散化+线段树应该也是可以AC的,姿势有很多种就对了……

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
struct Node
{
int ls, rs, v, w, sz;
int rnd;
};
Node T[N];
int tot, root; void init()
{
tot = 0;
}
void pushup(int k)
{
T[k].sz = T[T[k].ls].sz + T[T[k].rs].sz + T[k].w;
}
void lturn(int &k)
{
int rs = T[k].rs;
T[k].rs = T[rs].ls;
T[rs].ls = k;
T[rs].sz = T[k].sz;
pushup(k);
k = rs;
}
void rturn(int &k)
{
int ls = T[k].ls;
T[k].ls = T[ls].rs;
T[ls].rs = k;
T[ls].sz = T[k].sz;
pushup(k);
k = ls;
}
void ins(int &k, int v)
{
if (!k)
{
k = ++tot;
T[k].ls = T[k].rs = 0;
T[k].v = v;
T[k].w = T[k].sz = 1;
T[k].rnd = rand();
}
else
{
++T[k].sz;
if (v == T[k].v)
++T[k].w;
else if (v < T[k].v)
{
ins(T[k].ls, v);
if (T[T[k].ls].rnd < T[k].rnd)
rturn(k);
}
else
{
ins(T[k].rs, v);
if (T[T[k].rs].rnd < T[k].rnd)
lturn(k);
}
}
}
void del(int &k, int v)
{
if (!k)
return ;
if (T[k].v == v)
{
if (T[k].w > 1)
{
--T[k].w;
--T[k].sz;
return ;
}
if (T[k].ls * T[k].rs == 0)
k = T[k].ls + T[k].rs;
else
{
if (T[T[k].ls].rnd < T[T[k].rs].rnd)
rturn(k);
else
lturn(k);
del(k, v);
}
}
else
{
--T[k].sz;
if (v < T[k].v)
del(T[k].ls, v);
else
del(T[k].rs, v);
}
}
int query_rank(int k, int x)
{
if (!k)
return 0;
else
{
if (T[k].v == x)
return T[T[k].ls].sz + 1;
else if (x < T[k].v)
return query_rank(T[k].ls, x);
else
return T[T[k].ls].sz + T[k].w + query_rank(T[k].rs, x);
}
}
int query_kth(int k, int pos)
{
if (!k)
return 0;
if (pos <= T[T[k].ls].sz)
return query_kth(T[k].ls, pos);
else if (pos > T[T[k].ls].sz + T[k].w)
return query_kth(T[k].rs, pos - T[T[k].ls].sz - T[k].w);
else
return T[k].v;
}
void query_pre(int k, int v, int &ans)
{
if (!k)
return;
if (T[k].v < v)
{
ans = k;
query_pre(T[k].rs, v, ans);
}
else
query_pre(T[k].ls, v, ans);
}
void query_post(int k, int v, int &ans)
{
if (!k)
return ;
if (T[k].v > v)
{
ans = k;
query_post(T[k].ls, v, ans);
}
else
return query_post(T[k].rs, v, ans);
}
int main(void)
{
srand(987654321);
int n, x, ops, idx;
while (~scanf("%d", &n))
{
init();
while (n--)
{
scanf("%d%d", &ops, &x);
switch (ops)
{
case 1:
ins(root, x);
break;
case 2:
del(root, x);
break;
case 3:
printf("%d\n", query_rank(root, x));
break;
case 4:
printf("%d\n", query_kth(root, x));
break;
case 5:
query_pre(root, x, idx);
printf("%d\n", T[idx].v);
break;
case 6:
query_post(root, x, idx);
printf("%d\n", T[idx].v);
break;
}
}
}
return 0;
}

BZOJ 3224 普通平衡树(Treap模板题)的更多相关文章

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

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

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

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

  3. 平衡树Treap模板与原理

    这次我们来讲一讲Treap(splay以后再更) 平衡树是一种排序二叉树(或二叉搜索树),所以排序二叉树可以迅速地判断两个值的大小,当然操作肯定不止那么多(不然我们还学什么). 而平衡树在排序二叉树的 ...

  4. POJ1442-查询第K大-Treap模板题

    模板题,以后要学splay,大概看一下treap就好了. #include <cstdio> #include <algorithm> #include <cstring ...

  5. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  6. [luogu3369]普通平衡树(treap模板)

    解题关键:treap模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

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

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

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

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

  9. BZOJ 3224 普通平衡树

    这个是第一份完整的treap代码.嗯...虽然抄的百度的版,但还是不错的. !bzoj上不能用srand. #include<iostream>#include<cstdio> ...

随机推荐

  1. 跟我一起从零开始学WCF系列课程

    http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/WCF_Begin.aspx 服务和协定 服务协定使 ...

  2. C# checked运算符

    一.C# checked运算符 checked运算符用于对整型算术运算和显式转换启用溢出检查. 默认情况下,表达式产生的值如果超出了目标类型的范围,将会产生两种情况: ?常数表达式将导致编译时错误. ...

  3. 逗塔战争TD新人入门图文攻略

    逗塔战争TD新人入门图文攻略   <逗塔战争TD>是一张基于DOTA改编的塔防TD,很多玩家都很喜欢这张图,新手玩家怎么快速上手这张图呢?这张图的玩法和基本规则并不难,下面就为大家带来新人 ...

  4. ORTP-0.27.0移植

    注意: a. 对于0.27一下版本的ORTP的交叉编译则没有一下依赖库 b. 交叉编译工具链是: arm-linux-gnueabihf-gcc-4.9.1 (4.9版本一下的编译bctoolbox出 ...

  5. 高级字符驱动之堵塞与非堵塞IO

    /** *此实例涉及到线程的挂起与竞态,字符IO的堵塞与非堵塞 */ struct scull_pipe { wait_queue_head_t inp, outp; char *buffer, *e ...

  6. 2.3.3 zerosum 和为零

    #include<bits/stdc++.h> using namespace std; ],a; ]={' ','+','-'}; void out() { ;i<a;i++) c ...

  7. 2018.11.7 Nescafe29 T1 穿越七色虹

    题目 题目背景 在 Nescafe27 和 28 中,讲述了一支探险队前往 Nescafe 之塔探险的故事…… 当两位探险队员以最快的时间把礼物放到每个木箱里之后,精灵们变身为一缕缕金带似的光,簇簇光 ...

  8. 爬虫学习(三)——get请求参数解析

    get请求:        用户输入搜索的内容,发送请求,将请求的内容保存起来.        get请求的本质是在地址栏中输入参数进行的一种请求方式. 解析参数使用urllib.parse impo ...

  9. java的模运算

    在学习某个加密算法的时候留意到模运算,仔细查了资料后才注意到Java中的 % 其实是取余而不是取模,但是百度的时候找到的很多文章都把Java的 % 直接当成取模来用了,为了少踩坑所以自己整理了一下写了 ...

  10. Cluster - 基本概念

    1.1 什么是集群 简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节点(node).一个理想的集群是,用户从来不会意识到集群系统 ...