L3-002 特殊堆栈
题目链接:L3-002 特殊堆栈
题目描述:
堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。输入格式:
输入的第一行是正整数 N(≤10
5
)。随后 N 行,每行给出一句指令,为以下 3 种之一:
Push key
Pop
PeekMedian
其中key
是不超过 10^5
的正整数;Push 表示“入栈”;Pop 表示“出栈”;PeekMedian 表示“取中值”。输出格式:
对每个 Push 操作,将 key 插入堆栈,无需输出;对每个 Pop 或 PeekMedian 操作,在一行中输出相应的返回值。若操作非法,则对应输出 Invalid。输入样例:
17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop
输出样例:
Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid
分析:对于每次栈中元素的入栈、出栈,我们很明显,需要真正模拟这个栈,这样才能知道正确的元素。对于每次查询中间元素,我们很容易想到二分。但是对于栈中的无序元素,我们应该如何处理呢?
一开始我想的是再用一个数组,对于每次查询中值,将原数组“复制”然后排序,最后输出。果不其然,超时了,只有17分。
让我们想想时间耗费在了哪里。栈的模拟无法再优化,而对于每次中值的查询,我们不仅需要O(n)的时间取“复制数组”,还需要O(nlogn)的时间去排序。很明显,每次这样做的时间耗费是巨大的。我们可以很自然的联想到,**维护一个有序的序列即可。每次元素的增删在此序列同步更新。**这样每次元素的增删只需要O(logn)的复杂度。由于是动态的,我们自然想到使用vector。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const int N=1e6+5;
int a[N],top,n;
vector<int>v;
void Insert(int x){//编号no是第一个大于等于x的数字,那么直接插到到no位置上面 int no=lower_bound(v.begin(),v.end(),x)-v.begin();v.insert(v.begin()+no,x);
}
void Delete(int x){int no=lower_bound(v.begin(),v.end(),x)-v.begin();v.erase(v.begin()+no);
}
int Query(){int len=v.size();//奇数if(len&1)return v[(len+1)/2-1];//-1是因为下标从0开始的return v[len/2-1];
}
int main(){cin>>n;while(n--){string s;cin>>s;if(s=="Pop"){if(top==0)cout<<"Invalid\n";else{cout<<a[top-1]<<endl;Delete(a[top-1]);top--;}}else if(s=="Push"){int t;cin>>t;a[top++]=t;Insert(t);}else{if(top==0){cout<<"Invalid\n";continue;}cout<<Query()<<endl;}}return 0;
}
L3-002 特殊堆栈相关推荐
- 《数据结构》002线性结构——0B 堆栈
栈:仅在表头定义操作的线性表 引例: 运算数+运算符(前缀.中缀:a+b*c-d/e.后缀:abc*+de) 例1:(1)计算 62/3-42*+ =___ 解: 6/2 = 3 --> 33- ...
- c++堆栈溢出怎么解决_StackOverFlowError 常见原因及解决方法
点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 每一个 JVM 线程都拥有一个私有的 JVM 线程栈,用于存放当前线程的 JVM 栈帧(包括被调用函 ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)
[CCCC]PAT : 团体程序设计天梯赛-练习集 L3 答案 顶着满课,整整一星期,终于咕完了.(:´д`)ゞ 知识点分类(23): 1.搜索模拟(5):BFS,DFS,最短路,路径打印 2.计算几 ...
- MATLAB实现自编码器(三)——堆栈自编码器Stacked Autoencoders实现手写数字分类
在前面两篇博客的基础上,可以实现单层自编码器网络(一个解码器+一个解码器).对于多层自编码器的实现,MATLAB给出了堆栈自编码器用于图像分类的网页Train Stacked Autoencoders ...
- 002 - new javascript 基础
002 - new javascript 基础 ####★技巧★ JS 引入 返回 从哪来到哪去 <script src="javascript:history.go(-1)" ...
- Android NDK 中堆栈日志 add2line 的分析实践
文章目录 目的 常用的辅助工具 分析步骤 参考 目的 Android NDK 中出现的 crash 日志分析定位,使用 addr2line 对库中定位so 动态库崩溃位置,定位到某个函数的具体的代码行 ...
- CCCC 天梯赛 PTA ZOJ 题目 L1 L2 L3
PTA 天梯赛题目整理 L2 难点 **L2-001 紧急救援** **L2-002 链表去重** **L2-003 月饼** **L2-004 这是二叉搜索树吗** **L2-005 集合相似度** ...
- linux查看qq进程,Linux 进程初始堆栈内容查看
在学习<程序员的自我修养>时,对其P172页图6-12 "Linux进程初始堆栈"内容的来路有点兴趣,遂花了点时间研究了下,茫然中居然试探出了条可以得到进程初始堆栈的途 ...
- 压电陶瓷堆栈执行器线性模型simulink仿真
压电堆栈的数学模型 假设条件 让我们考虑一个横截面为 S0 的薄膜致动器,其一端固定在固定基座上,其初始尺寸 l0 在电场 E 的作用下沿场作用方向改变值 l,移动质量为 m0 的控制对象,其自由端铰 ...
- WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中和其他技巧)
1.使用windbg打开dump文件,同时设置symbols. 如果之前下载过windows的symbols就直接设置symbols path: (windows和程序的pdb) 例如:C:\Symb ...
最新文章
- vue vuex 挂载_Vue $mount()手动挂载
- Hadoop集群搭建(二:集群主机间免密登录配置)
- VMware vSphere 虚拟化简介
- sql server中的decimal或者numeric的精度问题 (转载)
- 1103 Integer Factorization (30 分)【难度: 中 / 爆搜】
- Zabbix 监控LVS连接的状态
- python数据框拼接_pandas数据拼接的实现示例
- 【PRML 学习笔记】附录 - 变分法 (Calculus of Variations)
- Jenkins配置邮件, Extended E-mail Notification, 破解管理员密码
- java判断访问设备类型
- 用html js制作迷宫,JavaScript生成随机迷宫详解
- MaxScript入门指引系列(五)数组和Visual MaxScript editor
- QT的安装------QT
- 日文配列键盘修改和映射自定义
- 解决在cmd情况下无法连接MySQL情况(无脑操作教程)
- 英文wiki技术基础问题查询的常见问题
- 海大C程序期末上机题库20道
- HTML5——7个最牛的HTML5移动开发框架
- laraveladmin省市区三级联动
- 人脸识别闸机python_Python 40行代码实现人脸识别功能
热门文章
- 企业微信 接收消息服务器,接收消息与事件
- 使用python对学生表的查询_多表组合查询——Python操作Mysql数据库
- linux系统下管理网口ip设置密码,Linux系统管理-(12)-网络配置IP命令
- 黑盒测试之边界值测试
- springboot整合mybatis和mybatis-plus
- Android Studio 第五十期 - 自定义TabLayout
- GridView 与ImageAdapter (笔记)
- bash shell命令(2)
- 在 Virt-manager 图形界面中使用桥接网络
- HDOJ-1062 Text Reverse