传送门:动态序列操作

在一个动态变化的序列中,完成以下基本操作:

(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)的更多相关文章

  1. NOIP 模拟 序列操作 - 无旋treap

    题意: 一开始有n个非负整数h[i],接下来会进行m次操作,第i次会给出一个数c[i],要求选出c[i]个大于0的数并将它们-1,问最多可以进行多少次? 分析: 首先一个显然的贪心就是每次都将最大的c ...

  2. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  3. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  4. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1961  Solved: 991[Submit][Status ...

  5. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  6. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  7. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary> /// MySql ...

  8. [bzoj]2962序列操作

    [bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...

  9. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...

随机推荐

  1. KiCad EDA 如何修改 Pcbnew 线路板的背景色?

    KiCad EDA 如何修改 Pcbnew 线路板的背景色? 关于背景色,传统的原理图是白色,线路板是黑色. EDA 软件 类型 颜色 Protel 原理图 浅黄色 Protel PCB 黑色 Orc ...

  2. 远程安装App到手机

    注意: 必须是手机和电脑网络连通正常 1. 手机端安装终端模拟器. 2. 打开终端模拟器执行下面命令(也可以在adb shell中执行): su setprop service.adb.tcp.por ...

  3. 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准

    4月9日,澳门当地时间下午4:00-5:30,阿里云在ICDE 2019举办了主题为“云时代的数据库”的专场分享研讨会. 本次专场研讨会由阿里巴巴集团副总裁.高级研究员,阿里云智能数据库产品事业部负责 ...

  4. Warning!程序员们小心被技术绑架

    通常我们说程序员需要在某个技术方向上积累到一定的厚度,要能够运用技术有效地解决实际问题.可是当程序员在某一项技术上浸淫时间长了之后,却经常会出现另外的问题,那就是:看待问题时受限于自身的技术积累. 我 ...

  5. 云原生生态周报 Vol. 2

    摘要: Cloud Native Weekly China Vol. 2 业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布 ...

  6. git 练习

    删除文件 git rm test.txt git  commit -m 'remove test.txt' 回复到最新版本 git checkout -- test.txt git checkout ...

  7. Jmeter处理数据库

    安装环境: jmeter版本:3.1版本 java1.8版本 安装步骤: 1.下载连接mysql数据库jar包,地址:https://pan.baidu.com/s/10k6zD6CU4mo7xYJF ...

  8. url地址栏参数<==>对象(将对象转换成地址栏的参数以及将地址栏的参数转换为对象)的实用函数

    /** * @author web得胜 * @param {Object} obj 需要拼接的参数对象 * @return {String} * */ function obj2qs(obj) { i ...

  9. python-字符编码数据类型转换

    1 - 编码格式转换 1.1 编码格式介绍 字符集 介绍 ASCII ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 ANSI ANSI是一种字符代码,为使计算 ...

  10. Python os.getcwd() 方法

    Python os.getcwd() 方法  Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...