3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 9629  Solved: 4091
[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.每个数的数据范围:[-1e7,1e7]
数据如下http://pan.baidu.com/s/1jHMJwO2

Source

[Submit][Status][Discuss]

FHQ Treap

 #include <bits/stdc++.h>

 const int N = ;

 int ls[N], rs[N], vl[N], tg[N], sz[N];

 inline int node(int v)
{
static int t = ;
sz[t] = ;
vl[t] = v;
tg[t] = rand();
return t++;
} int merge(int a, int b)
{
if (!a || !b)return a + b;
if (tg[a] > tg[b])
{
rs[a] = merge(rs[a], b);
sz[a] = + sz[ls[a]] + sz[rs[a]];
return a;
}
else
{
ls[b] = merge(a, ls[b]);
sz[b] = + sz[ls[b]] + sz[rs[b]];
return b;
}
} void split(int t, int k, int &a, int &b)
{
if (!t)a = b = ;
else
{
if (vl[t] <= k)
a = t, split(rs[t], k, rs[t], b);
else
b = t, split(ls[t], k, a, ls[t]);
sz[t] = + sz[ls[t]] + sz[rs[t]];
}
} int kth(int t, int k)
{
if (k <= sz[ls[t]])
return kth(ls[t], k);
else if (k == sz[ls[t]] + )
return t;
else
return kth(rs[t], k - sz[ls[t]] - );
} signed main(void)
{
srand(); int n, r = ; scanf("%d", &n); for (int a, b, x, y, z; n--; )
{
scanf("%d%d", &a, &b); if (a == )
{
split(r, b, x, y);
r = merge(x, node(b));
r = merge(r, y);
}
else if (a == )
{
split(r, b, x, z);
split(x, b - , x, y);
y = merge(ls[y], rs[y]);
r = merge(x, y);
r = merge(r, z);
}
else if (a == )
{
split(r, b - , x, y);
printf("%d\n", sz[x] + );
r = merge(x, y);
}
else if (a == )
printf("%d\n", vl[kth(r, b)]);
else if (a == )
{
split(r, b - , x, y);
printf("%d\n", vl[kth(x, sz[x])]);
r = merge(x, y);
}
else
{
split(r, b, x, y);
printf("%d\n", vl[kth(y, )]);
r = merge(x, y);
}
}
}
 #include <bits/stdc++.h>
const int N = ;
int ls[N], rs[N], vl[N], tg[N], sz[N], tot = ;
int node(int v) {
return vl[tot] = v, sz[tot] = , tg[tot] = rand(), tot++;
}
int merge(int a, int b) {
if (!a || !b)return a + b;
if (tg[a] > tg[b]) {
rs[a] = merge(rs[a], b);
sz[a] = + sz[ls[a]] + sz[rs[a]];
return a;
}
else {
ls[b] = merge(a, ls[b]);
sz[b] = + sz[ls[b]] + sz[rs[b]];
return b;
}
}
int split(int t, int k, int &a, int &b) {
if (!t)return a = b = , ;
if (vl[t] <= k)
a = t, split(rs[t], k, rs[t], b);
else
b = t, split(ls[t], k, a, ls[t]);
return sz[t] = + sz[ls[t]] + sz[rs[t]];
}
int kth(int t, int k) {
return k <= sz[ls[t]] ? kth(ls[t], k) : ((k -= sz[ls[t]] + ) ? kth(rs[t], k) : vl[t]);
}
signed main(void) {
int n, r = , a, b, x, y, z;
for (scanf("%d", &n); n--; ) {
scanf("%d%d", &a, &b);
if (a == )
split(r, b, x, y), r = merge(merge(x, node(b)), y);
else if (a == )
split(r, b, x, z), split(x, b - , x, y), r = merge(merge(x, merge(ls[y], rs[y])), z);
else if (a == )
split(r, b - , x, y), printf("%d\n", sz[x] + ), r = merge(x, y);
else if (a == )
printf("%d\n", kth(r, b));
else if (a == )
split(r, b - , x, y), printf("%d\n", kth(x, sz[x])), r = merge(x, y);
else
split(r, b, x, y), printf("%d\n", kth(y, )), r = merge(x, y);
}
}

@Author: YouSiki

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

  1. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

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

  2. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  3. BZOJ 3224: Tyvj 1728 普通平衡树 vector

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  4. BZOJ 3224: Tyvj 1728 普通平衡树(BST)

    treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...

  5. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

  6. BZOJ 3224 Tyvj 1728 普通平衡树模板

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

  7. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

  8. bzoj 3224/Tyvj 1728 普通平衡树(splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  9. fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树

    题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...

随机推荐

  1. iOS 直播-网速监控

    iOS 直播-网速监控 CXNetworkSpeed.h // // CXNetworkSpeed.h // CXNetworkSpeedDemo // // Created by xubaoaich ...

  2. iOS 学习 - 24 全局跑马灯,支持后台回到前台

    思路: 1.创建一个单例 + (instancetype)shareManager { static CCPaomaView *pModel = nil; static dispatch_once_t ...

  3. 进新公司用cornerstone-checkout后遇到的奇葩bug,及解决方法

    从cornerstone中checkout下新的工程,运行报错. 1.开始错误原因是找不到相对应的某个.m文件的路径 解决方案:将缺少的.m文件重新从项目文件夹中导入 2.后来显示 造成的原因是在下面 ...

  4. 敏捷开发与jira

    项目背景 项目是基于一套公司自主研发的平台做企业信息化的项目管理业务,经过两个里程碑的交付,已经在客户现场使用,每次版本都能按期交付,延迟较少,客户满意度也高. 项目开发过程采用的敏捷的方法,用类Sc ...

  5. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. 内嵌iframe

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs& ...

  7. 机器学习之寻找KMeans的最优K

    K-Means聚类算法是最为经典的,同时也是使用最为广泛的一种基于划分的聚类算法,它属于基于距离的无监督聚类算法.KMeans算法简单实用,在机器学习算法中占有重要的地位.对于KMeans算法而言,如 ...

  8. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...

  9. [WPF系列]-DataBinding(数据绑定) 自定义Binding

    自定义Binding A base class for custom WPF binding markup extensions BindingDecoratorBase Code: public c ...

  10. 系统集成方案(一).NET集成方案

    NET系统集成有自己独立的登录验证方式.比如,跟报表集成时,不需要再使用报表内置的登录界面,只需要将报表默认的参数用户名fr_username和密码fr_password发送给报表系统,触发一下报表验 ...