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的序列, ...
随机推荐
- objectarx之两条曲线最短距离
double CCommonFuntion::GetLineDistance(AcDbObjectId& Line1, AcDbObjectId& Line2){ AcGeLineSe ...
- oracle Transactional
从shutdown transactional命令发布起, 禁止建立任何新的oracle连接. 从shutdown transactional命令发布起,禁止启动任何新的事务. 一旦数据库上所有的活动 ...
- JavaScript--开关思想
就是男默女泪的立flag! <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- JavaScript--for in循环访问属性用"."和[ ]的区别
// for in 循环遍历对象的时候// 内部要访问属性的时候不能点语法访问,因为for in 的key是字符串格式// 可通过方括号实现访问 for(var key in manObj) { co ...
- java返回结果集封装
1.返回消息统一定义文件CodeMsg.java public class CodeMsg { private int retCode; private String message; // 按照模块 ...
- 关闭myeclipse可视化视图
ctrl+w 关闭各个文件 重新打开即可 方法二:
- HDU - 4725_The Shortest Path in Nya Graph
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Java练习 SDUT-2400_高中数学?
高中数学? Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 高中数学大家都学过数列,其中一个重要的概念就是数列的通项,可 ...
- 【Linux】gnuplot命令大全
gnuplot命令大全 在linux命令提示符下运行gnuplot命令启动,输入quit或q或exit退出. plot命令 gnuplot> plot sin(x) with line line ...
- ROS开发过程中遇到:Could not find a package configuration file provided by "qt_build" with any of the following names: qt_buildConfig.cmake qt_build-config.cmake........
最近在搭建QT开发ROS 界面的环境,遇到了很多问题,参考了很多资料,最后发现有些问题其实没有那么复杂,只是我们对整体环境还不了解,熟悉了以后你会发现有些问题就迎刃而解了. 在这个过程中,我首先新建了 ...