题目链接: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 特殊堆栈相关推荐

  1. 《数据结构》002线性结构——0B 堆栈

    栈:仅在表头定义操作的线性表 引例: 运算数+运算符(前缀.中缀:a+b*c-d/e.后缀:abc*+de) 例1:(1)计算 62/3-42*+ =___ 解: 6/2 = 3 --> 33- ...

  2. c++堆栈溢出怎么解决_StackOverFlowError 常见原因及解决方法

    点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 每一个 JVM 线程都拥有一个私有的 JVM 线程栈,用于存放当前线程的 JVM 栈帧(包括被调用函 ...

  3. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L3 答案 顶着满课,整整一星期,终于咕完了.(:´д`)ゞ 知识点分类(23): 1.搜索模拟(5):BFS,DFS,最短路,路径打印 2.计算几 ...

  4. MATLAB实现自编码器(三)——堆栈自编码器Stacked Autoencoders实现手写数字分类

    在前面两篇博客的基础上,可以实现单层自编码器网络(一个解码器+一个解码器).对于多层自编码器的实现,MATLAB给出了堆栈自编码器用于图像分类的网页Train Stacked Autoencoders ...

  5. 002 - new javascript 基础

    002 - new javascript 基础 ####★技巧★ JS 引入 返回 从哪来到哪去 <script src="javascript:history.go(-1)" ...

  6. Android NDK 中堆栈日志 add2line 的分析实践

    文章目录 目的 常用的辅助工具 分析步骤 参考 目的 Android NDK 中出现的 crash 日志分析定位,使用 addr2line 对库中定位so 动态库崩溃位置,定位到某个函数的具体的代码行 ...

  7. CCCC 天梯赛 PTA ZOJ 题目 L1 L2 L3

    PTA 天梯赛题目整理 L2 难点 **L2-001 紧急救援** **L2-002 链表去重** **L2-003 月饼** **L2-004 这是二叉搜索树吗** **L2-005 集合相似度** ...

  8. linux查看qq进程,Linux 进程初始堆栈内容查看

    在学习<程序员的自我修养>时,对其P172页图6-12 "Linux进程初始堆栈"内容的来路有点兴趣,遂花了点时间研究了下,茫然中居然试探出了条可以得到进程初始堆栈的途 ...

  9. 压电陶瓷堆栈执行器线性模型simulink仿真

    压电堆栈的数学模型 假设条件 让我们考虑一个横截面为 S0 的薄膜致动器,其一端固定在固定基座上,其初始尺寸 l0 在电场 E 的作用下沿场作用方向改变值 l,移动质量为 m0 的控制对象,其自由端铰 ...

  10. WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中和其他技巧)

    1.使用windbg打开dump文件,同时设置symbols. 如果之前下载过windows的symbols就直接设置symbols path: (windows和程序的pdb) 例如:C:\Symb ...

最新文章

  1. vue vuex 挂载_Vue $mount()手动挂载
  2. Hadoop集群搭建(二:集群主机间免密登录配置)
  3. VMware vSphere 虚拟化简介
  4. sql server中的decimal或者numeric的精度问题 (转载)
  5. 1103 Integer Factorization (30 分)【难度: 中 / 爆搜】
  6. Zabbix 监控LVS连接的状态
  7. python数据框拼接_pandas数据拼接的实现示例
  8. 【PRML 学习笔记】附录 - 变分法 (Calculus of Variations)
  9. Jenkins配置邮件, Extended E-mail Notification, 破解管理员密码
  10. java判断访问设备类型
  11. 用html js制作迷宫,JavaScript生成随机迷宫详解
  12. MaxScript入门指引系列(五)数组和Visual MaxScript editor
  13. QT的安装------QT
  14. 日文配列键盘修改和映射自定义
  15. 解决在cmd情况下无法连接MySQL情况(无脑操作教程)
  16. 英文wiki技术基础问题查询的常见问题
  17. 海大C程序期末上机题库20道
  18. HTML5——7个最牛的HTML5移动开发框架
  19. laraveladmin省市区三级联动
  20. 人脸识别闸机python_Python 40行代码实现人脸识别功能

热门文章

  1. 企业微信 接收消息服务器,接收消息与事件
  2. 使用python对学生表的查询_多表组合查询——Python操作Mysql数据库
  3. linux系统下管理网口ip设置密码,Linux系统管理-(12)-网络配置IP命令
  4. 黑盒测试之边界值测试
  5. springboot整合mybatis和mybatis-plus
  6. Android Studio 第五十期 - 自定义TabLayout
  7. GridView 与ImageAdapter (笔记)
  8. bash shell命令(2)
  9. 在 Virt-manager 图形界面中使用桥接网络
  10. HDOJ-1062 Text Reverse