L3-002. 堆栈

时间限制
200 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序
Standard

作者
陈越

大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。

输入格式:

输入第一行给出正整数N(<= 105)。随后N行,每行给出一个操作指令,为下列3种指令之一:

Push key
Pop
PeekMedian

其中Push表示入栈,key是不超过105的正整数;Pop表示出栈;PeekMedian表示查中值。

输出格式:

对每个入栈指令,将key入栈,并不输出任何信息。对每个出栈或查中值的指令,在一行中打印相应的返回结果。若指令非法,就打印“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

思路:模拟堆栈+BIT

首先push,pop操作可以先用一个堆栈来存储模拟,并且需要对BIT进行更新,譬如要push一个数x,那么在BIT的第x个位置处+1,代表该位置上存有这个数,同理,pop一个数x时,在BIT的位置x处-1,消掉该数的记录。遇到查中值时即可对BIT二分搜索,譬如要查第n/2个数,若这个数数值为x,那么对BIT从1到x所有位置进行取和的值就是n/2。

AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<set>
using namespace std;
#define N_MAX 100000+2
#define INF 0x3f3f3f3f
int n;
int bit[N_MAX + 1];int sum(int i) {int s = 0;while (i>0) {s += bit[i];i -= i&-i;}return s;
}void add(int i,int x) {while (i<=N_MAX) {//!!!!!!!!bit[i] += x;i += i&-i;}
}bool C(int x,int n) {if (sum(x) >= n)return true;else return false;
}int st[N_MAX];int main() {while (scanf("%d", &n) != EOF) {memset(bit, 0, sizeof(bit));int num = 0;while (n--) {char s[20]; scanf("%s",s);if (s[1] == 'o') {if (num == 0) { puts("Invalid"); continue; }printf("%d\n", st[num-1]);add(st[num-1], -1);num--;}else if (s[1] == 'u') {int a; scanf("%d", &a);add(a, 1); st[num++]=a;}else if (s[1] == 'e') {if (num == 0) { puts("Invalid"); continue; }int lb = 0, ub = N_MAX;//!!!int cnt = num;if (cnt & 1)cnt = (cnt + 1) / 2;else cnt /= 2;while (ub - lb > 1) {int mid = (lb + ub) >> 1;if (C(mid, cnt))ub = mid;else lb = mid;}printf("%d\n", ub);}}}return 0;
}

转载于:https://www.cnblogs.com/ZefengYao/p/8588957.html

pat 甲级 L3-002. 堆栈相关推荐

  1. PAT甲级(Advanced Level)真题--1046 Sharing

    PAT甲级(Advanced Level)真题–1046 Sharing 通过:648 提交:1138 通过率:56% To store English words, one method is to ...

  2. PAT甲级(Advanced Level)真题-- 1062 To Buy or Not to Buy

    PAT甲级(Advanced Level)真题-- 1062 To Buy or Not to Buy 通过:643 提交:1220 通过率:52% Eva would like to make a ...

  3. PAT甲级真题 1018 A+B in Hogwarts--python解法

    PAT甲级真题 1018 A+B in Hogwarts 提交:2638 通过:1559 通过率:59% If you are a fan of Harry Potter, you would kno ...

  4. Pat甲级 1002 A+B for Polynomials

    Pat甲级 1002 A+B for Polynomials 思路 代码 题目网址 https://pintia.cn/problem-sets/994805342720868352/problems ...

  5. Pat甲级 1001 A+B Format

    Pat甲级 1001 A+B Format 思路 代码 题目网址 https://pintia.cn/problem-sets/994805342720868352/problems/99480552 ...

  6. PAT甲级1055 The World‘s Richest:[C++题解]k路归并

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 采用二维数组vector[N]来存每个年龄的人(结构体),然后分别从大到小排序.剩下的任务就是从给定的年龄[a ,b]中,k路归并最 ...

  7. PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...

  8. PAT甲级1085 Perfect Sequence :[C++题解]双指针

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:求满足条件M≤m×pM \leq m\times pM≤m×p的区间[m, M]最长是多少.此处有一性质:当最大值M变大的时候,最小值 ...

  9. PAT甲级1046 Shortest Distance:[C++题解]前缀和

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 用前缀和快速求出一段的和.注意求两段,取最小值. ac代码 #include<bits/stdc++.h> using ...

  10. PAT甲级1029 Median:[C++题解]贪心、二路归并

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 如果直接排序,时间复杂度是O(nlogn),n=2∗105O(nlogn),\ n=2*10^5O(nlogn), n=2∗105会 ...

最新文章

  1. 无法访问http,会强制跳到https
  2. springboot2处理跨域
  3. 技术系列课|从NE264到NE265:视频编码技术缔造美好生活
  4. 4.windows和Linux下创建oracle用户名表空间,表,插入数据,用户管理表等操作
  5. Pytorch模型(.pth)转onnx模型(.onnx)
  6. STM32工作笔记0014---认识emWin图形设计框架
  7. selenium webdirver之ruby-开发ide乱码解决方案
  8. Linux内核空间与用户空间信息交互方法
  9. 使用Java复制文件及显示进度
  10. 金蝶K3工程变更操作指南
  11. 74HC595引脚图时序图工作原理及pdf中文资料lsh
  12. 生活随记 - 2020国庆第三天
  13. IP地址中A类、B类、C类地址的区别
  14. 黑群晖vmm专业版_折腾群晖笔记:利用VMM虚拟机 安装LEDE旁路由 实现软路由超强功能...
  15. $%7BpageContext.request.contextPath%7D
  16. 在解决prob中遇到的prob...
  17. SPM12入门案例1
  18. .dwg转换为.svg
  19. HDFS磁盘满了扩容
  20. [读书笔记]第九章 当一只小猫扑向大狗 不论大狗多有理 人们总为小猫叫屈

热门文章

  1. 一支口红用了5年_用了7年微信才知道!原来微信隐藏5大实用功能,比app更好用...
  2. 金蝶osf接口开发_解决SaaS间的数据孤岛,实现SaaS数据接口集成互通互联
  3. 爆炸的符卡洋洋洒洒(01背包)
  4. win10不能访问服务器共享文件夹权限,win10系统共享文件夹无法访问的解决方法...
  5. 授权普通非DBA用户可以有权限查看执行计划的方法
  6. 01-执行上下文与变量对象
  7. XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation
  8. ASA L2L *** IKEV2共享密钥配置
  9. HTML5初探 - 基本的HTML5模版
  10. 信息技术是一把双刃剑,如何掌控好这柄剑?