大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于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

分析:如果排序查找的话会超时,用树状数组,即求第k = (s.size() + 1) / 2大的数。查询小于等于x的数的个数是否等于k的时候用二分法更快~

#include <cstdio>
#include <stack>
#define lowbit(i) ((i) & (-i))
const int maxn = 100010;
using namespace std;
int c[maxn];
stack<int> s;
void update(int x, int v) {for(int i = x; i < maxn; i += lowbit(i))c[i] += v;
}
int getsum(int x) {int sum = 0;for(int i = x; i >= 1; i -= lowbit(i))sum += c[i];return sum;
}
void PeekMedian() {int left = 1, right = maxn, mid, k = (s.size() + 1) / 2;while(left < right) {mid = (left + right) / 2;if(getsum(mid) >= k)right = mid;elseleft = mid + 1;}printf("%d\n", left);
}
int main() {int n, temp;scanf("%d", &n);char str[15];for(int i = 0; i < n; i++) {scanf("%s", str);if(str[1] == 'u') {scanf("%d", &temp);s.push(temp);update(temp, 1);} else if(str[1] == 'o') {if(!s.empty()) {update(s.top(), -1);printf("%d\n", s.top());s.pop();} else {printf("Invalid\n");}} else {if(!s.empty())PeekMedian();elseprintf("Invalid\n");}}return 0;
}

L3-002. 堆栈-PAT团体程序设计天梯赛GPLT(树状数组)相关推荐

  1. L2-005 集合相似度-PAT团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-005 集合相似度 题目大意 给定 nnn 个集合,然后有 kkk 次询问,每次询问都要求出 Nc/Nt×100%N_c / N_t \times ...

  2. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT

    天梯赛是个善良的比赛.善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分. 于是命题组首先将编程能力划分成了 106个等级( ...

  3. L1-078 吉老师的回归 (15 分)-PAT 团体程序设计天梯赛 GPLT

    曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦! 为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的.只包括可打印符号的字符串描述出来,如:Problem A: Print &q ...

  4. [Python] L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  5. L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  6. L3-007. 天梯地图-PAT团体程序设计天梯赛GPLT

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  7. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  8. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  9. L2-033 简单计算器 (25 分)-PAT 团体程序设计天梯赛 GPLT

    本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器.如上图所示,计算器由两个堆栈组成,一个堆栈 S1存放数字,另一个堆栈 S2存放运算符.计算器的最下方有一个等号键,每次按下这个键,计 ...

最新文章

  1. RedHat Linux乱码解决方案(转)
  2. shadow fight 1.6.0 内购
  3. 安卓高手之路之 图形系统之 图形框架(1)
  4. nmap 添加自定义指纹
  5. 【学术相关】热议:寒门硕士要不要继续读博士?
  6. JDBC的CRUD操作之PreparedStatement的查询操作
  7. 陈年牵手徐静蕾之一箭双雕
  8. 网络管理与维护作业11
  9. yii2 gii页面404和debug调试栏无法显示解决方法
  10. 大学计算机基础word操作2018,大学计算机基础试题及答案2017
  11. win7设置动态桌面,将视频设为桌面
  12. 吞食天地2重制版巫妖王panny版存档_11年前的冷饭—Nintendo 任天堂 Switch《宵星传奇 重制版》评测...
  13. 客户端修改服务器的cookie,客户端与服务器cookie
  14. 移动硬盘上装双系统Linux
  15. (一)线段树入门--补充与其他模板
  16. wget -O- ...|sh 的含义
  17. 2020-4-24 Open Web Application Security Project (OWASP)
  18. ESXI 6.7 环境 centos7.6 虚拟机安装tesla k80 显卡驱动失败问题解决
  19. iOS ideviceinstaller安装ipa报错zip_open
  20. Chart.js与ECharts.js图表组件对比与使用

热门文章

  1. HDFS-HA的配置-----自动Failover
  2. Android MuPDF 部署
  3. 算法列表-java实现
  4. TDtree冲刺第四天
  5. 如何写出让同事膜拜的漂亮代码?
  6. yii2在linux下面无法启用gii
  7. Android应用内嵌cocos2dx游戏项目
  8. rk3288对于parameter参数文件的解析处理【转】
  9. push跳转时隐藏tabBar
  10. java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet...