TOJ5705动态序列操作(STL or treap)
传送门:动态序列操作
在一个动态变化的序列中,完成以下基本操作:
(1)插入一个整数
(2)删除一个整数
(3)查找序列中最大的数
(4)查找序列中最小的数
(5)求x的前驱(前驱定义为不大于x的序列中最大的数)
(6)求x的后继(后继定义为不小于x的序列中最小的数)
输入
第一行为n,表示操作的次数,接下来有n行(n≤100000)
每行为以下操作之一:
(1)1 x:将x插入
(2)2 x:删除x,x在序列中一定存在,若有多个相同值,只删除一个。
(3)3:查找序列中最大的数
(4)4:查找序列中最小的数
(5)5 x:求x的前驱
(6)6 x:求x的后继
数据保证结果一定存在,其中序列中整数的绝对值不超过107。
输出
对于op取3、4、5、6等操作,输出相应的结果。
样例输入
10
1 2
3
1 5
4
1 10
2 5
1 3
6 8
1 11
5 3
样例输出
2
2
10
3
思路:
瞎搞:STL vector or 树状数组二分
正解:treap or splay(我也不会)
说说vector瞎搞吧,刚开始用set维护,需要另外有一个Map存是否删完了,于是光荣超内存了。扔了几天回头拿vector写了一发过了。
主要操作只有 insert:插入 earse:删除 , upper_bound ,lower_bound 两个对vector的二分查找。
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址
这里只需要注意,“不大于”,“不小于”这几个字眼即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
vector<int>v;
int main()
{
int _;
for(scanf("%d",&_);_--;){
int cmd,x;
scanf("%d",&cmd);
if(cmd == ){
scanf("%d",&x);
v.insert(lower_bound(v.begin(),v.end(),x),x);
}else if(cmd == ){
scanf("%d",&x);
v.erase(lower_bound(v.begin(),v.end(),x));
}else if(cmd == ){
printf("%d\n",v[v.size()-]);
}else if(cmd == ){
printf("%d\n",v[]);
}else if(cmd == ){
scanf("%d",&x);
vector<int>::iterator it = lower_bound(v.begin(),v.end(),x);
if((*it) == x)
printf("%d\n",x);
else
printf("%d\n",*(--it));
}
else if(cmd == ){
scanf("%d",&x);
vector<int>::iterator it = upper_bound(v.begin(),v.end(),x);
vector<int>::iterator itt = it;
if(*(--itt) == x && itt!=v.begin())
printf("%d\n",x);
else
printf("%d\n",*it);
}
/*---test---*/
int f = ;
if(f == ){
printf("zz :");
for(int i = ; i < v.size() ; i ++)
printf("%d ",v[i]);
puts("");
}
/*---test---*/
}
return ;
}/*
10
1 2
3
1 5
4
1 10
2 5
1 3
6 8
1 11
5 3 144
1 1
2 1
1 1
1 3
2 3
1 3
1 10
2 10
1 10
1 10
1 11
6 10
6 10
5 10
6 9
6 -100
5 123123
*/

600MS暴力做法
如果学完树状数组上二分,会更新一下树状数组二分的求解。
TOJ5705动态序列操作(STL or treap)的更多相关文章
- NOIP 模拟 序列操作 - 无旋treap
题意: 一开始有n个非负整数h[i],接下来会进行m次操作,第i次会给出一个数c[i],要求选出c[i]个大于0的数并将它们-1,问最多可以进行多少次? 分析: 首先一个显然的贪心就是每次都将最大的c ...
- Python通用序列操作
1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...
- 【BZOJ-2962】序列操作 线段树 + 区间卷积
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 678 Solved: 246[Submit][Status][Discuss] ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1961 Solved: 991[Submit][Status ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
- .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary> /// MySql ...
- [bzoj]2962序列操作
[bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...
- bzoj 2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...
随机推荐
- KiCad EDA 如何修改 Pcbnew 线路板的背景色?
KiCad EDA 如何修改 Pcbnew 线路板的背景色? 关于背景色,传统的原理图是白色,线路板是黑色. EDA 软件 类型 颜色 Protel 原理图 浅黄色 Protel PCB 黑色 Orc ...
- 远程安装App到手机
注意: 必须是手机和电脑网络连通正常 1. 手机端安装终端模拟器. 2. 打开终端模拟器执行下面命令(也可以在adb shell中执行): su setprop service.adb.tcp.por ...
- 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准
4月9日,澳门当地时间下午4:00-5:30,阿里云在ICDE 2019举办了主题为“云时代的数据库”的专场分享研讨会. 本次专场研讨会由阿里巴巴集团副总裁.高级研究员,阿里云智能数据库产品事业部负责 ...
- Warning!程序员们小心被技术绑架
通常我们说程序员需要在某个技术方向上积累到一定的厚度,要能够运用技术有效地解决实际问题.可是当程序员在某一项技术上浸淫时间长了之后,却经常会出现另外的问题,那就是:看待问题时受限于自身的技术积累. 我 ...
- 云原生生态周报 Vol. 2
摘要: Cloud Native Weekly China Vol. 2 业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布 ...
- git 练习
删除文件 git rm test.txt git commit -m 'remove test.txt' 回复到最新版本 git checkout -- test.txt git checkout ...
- Jmeter处理数据库
安装环境: jmeter版本:3.1版本 java1.8版本 安装步骤: 1.下载连接mysql数据库jar包,地址:https://pan.baidu.com/s/10k6zD6CU4mo7xYJF ...
- url地址栏参数<==>对象(将对象转换成地址栏的参数以及将地址栏的参数转换为对象)的实用函数
/** * @author web得胜 * @param {Object} obj 需要拼接的参数对象 * @return {String} * */ function obj2qs(obj) { i ...
- python-字符编码数据类型转换
1 - 编码格式转换 1.1 编码格式介绍 字符集 介绍 ASCII ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 ANSI ANSI是一种字符代码,为使计算 ...
- Python os.getcwd() 方法
Python os.getcwd() 方法 Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...