传送门:动态序列操作

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

(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. More Effective C++: 06杂项讨论

    32:在未来时态下发展程序 世事永远在变,好的软件对于变化有良好的适应能力:可以容纳新的性质,可以移植到新的平台,可以适应新的需求,可以掌握新的输入.所谓在未来时态下设计程序,就是接受“事情总会改变” ...

  2. Linux进程管理(三、 线程)

    // ---- refer glibc, pthread_create.c ----// int __pthread_create_2_0 (newthread, attr, start_routin ...

  3. Oracle函数——MINUS

    解释 “minus”直接翻译为中文是“减”的意思,在Oracle中也是用来做减法操作的,只不过它不是传统意义上对数字的减法,而是对查询结果集的减法.A minus B就意味着将结果集A去除结果集B中所 ...

  4. iOS 三种打电话方式

    //1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * str=[[NSMutableString alloc] initWit ...

  5. iOS 内存管理arc

    http://www.tekuba.net/program/346/ ios自动释放池(autoreleasepool #import <Foundation/Foundation.h> ...

  6. linux cat /etc/passwd 说明

    通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录.这行记录定义了每个用户账号的属性.下面是一个passwd文件的示例( ...

  7. 修改eclipse默认注释

    windows-->preference-->Java-->Code Style-->Code Templates -->Comments :注释--> ... 关 ...

  8. ros 工作空间下cpp文件调用其他cpp文件的函数或变量

    最近在学习ros节点编程,在工作空间下添加如下文件: message.h #ifndef MESSAGE_H #define MESSAGE_H extern int n; void init_ros ...

  9. windows 下的 Apache 二级域名 目录绑定配置

    通常我们注册的域名都是顶级域名  如 www.potatog.com,我们希望这个域名可以访问服务器的不同网站或者不同功能等等 可能会这样 www.potatog.com/api 或者 www.pot ...

  10. 15-8 pymysql的使用

    一 安装pymysql模块 1 pycharm安装 file-setting如图:然后点加号,搜索pymsql即可,点击安装 2 pip 安装 pip3 install pymysql 二  连接数据 ...