BZOJ 3224: Tyvj 1728 普通平衡树
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
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
84185
492737
HINT
Source
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 普通平衡树的更多相关文章
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...
- bzoj 3224/Tyvj 1728 普通平衡树(splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
随机推荐
- iOS 系统根据导航栏和状态栏自动修改布局
问题 条件:1.有一个全屏大小的带导航的controller 2.隐藏导航栏,最顶上还会留出状态栏的位置,而不是全屏显示 解决方法 self.automaticallyAdjustsScrollVie ...
- 对象映射工具AutoMapper介绍
AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper ...
- ORA-04063: view "SYS.DBA_REGISTRY" has errors
测试环境做了RMAN还原(从10.2.0.4.0 32bit 还原到 10.2.0.4.0 64bit)后,查询dba_registry系统视图时报如下错误 SQL> select comp_ ...
- JavaScript 易错知识点整理
本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES ...
- 实时事件统计项目:优化solr和morphline的时间字段
morphline优化,如下: 传过来的时间戳被复制到3个字段:eventTimeInMinuteChina_tdt ,eventTimeInMinuteUTC_tdt ,eventTimeInHou ...
- SpringMVC 处理异常的4种方式
springmvc处理异常有三种方式: 1.在一个controller中定义一个方法,用@ExceptionHandler注解标注.(优先级最高) @ExceptionHandler public M ...
- java实现文件变化监控
一. spring配置文件:application.xml <?xml version="1.0" encoding="UTF-8"?> <b ...
- 理解 virbr0 - 每天5分钟玩转 OpenStack(11)
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能. virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟 ...
- python paramiko 进行文件上传处理
#!/usr/bin/env python # -*- coding:utf-8 -*- import paramiko import uuid class Ha(object): def __ini ...
- linux init 启动顺序
redhat init大致启动过程 第一个运行的程序是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作.比如在设定了运行等级 “:id:3:initdefa ...