1057 Stack (30 分)
 

Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). Now you are supposed to implement a stack with an extra operation: PeekMedian -- return the median value of all the elements in the stack. With N elements, the median value is defined to be the (-th smallest element if N is even, or (-th if N is odd.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤). Then N lines follow, each contains a command in one of the following 3 formats:

Push key
Pop
PeekMedian

where key is a positive integer no more than 1.

Output Specification:

For each Push command, insert key into the stack and output nothing. For each Pop or PeekMedian command, print in a line the corresponding returned value. If the command is invalid, print Invalid instead.

Sample Input:

17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop

Sample Output:

Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid

题目大意:现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。
分析:用排序查询的方法会超时~~用树状数组,即求第k = (s.size() + 1) / 2大的数。查询小于等于x的数的个数是否等于k的时候用二分法更快~

AC代码:

#include<iostream>
#include<stack>
#define lowbit(i) ((i) & (-i))
const int maxn=;
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;//值为i的数出现并更新与其相关的数
}
int getsum(int x) {
int sum = ;
for(int i = x; i >= ; i -= lowbit(i))
sum += c[i];
return sum;
}
void PeekMedian() {//查询小于等于x的数的个数是否等于k的时候用二分法更快~
int left = , right = maxn, mid, k = (s.size() + ) / ;
while(left < right) {
mid = (left + right) / ;
if(getsum(mid) >= k)//每次用getsum(i)求得前i个数中实际出现了几个数,与中位数k比较即可
right = mid;
else
left = mid + ;
}
printf("%d\n", left);
}
int main() {
int n, temp;
scanf("%d", &n);
char str[];
for(int i = ; i < n; i++) {
scanf("%s", str);
if(str[] == 'u') {
scanf("%d", &temp);
s.push(temp);
update(temp, );
} else if(str[] == 'o') {
if(!s.empty()) {
update(s.top(), -);
printf("%d\n", s.top());
s.pop();
} else {
printf("Invalid\n");
}
} else {
if(!s.empty())
PeekMedian();
else
printf("Invalid\n");
}
}
return ;
}

最新文章

  1. 页面无法加载main.css
  2. socket阻塞与非阻塞,同步与异步
  3. #知识#室内设计原理ing
  4. imageNamed、imageWithContentsOfFile、imageWithData
  5. 8天学通MongoDB
  6. storm高级原语-Transactional topology
  7. tail-head
  8. web前端的学习误区
  9. ajax在ie下返回未定义解决方案
  10. 利用LinkedList实现洗牌功能
  11. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
  12. Dockerfile详解及优化
  13. Yii的数值比较验证器
  14. NSGA-II入门C1
  15. 【转载】在MySQL登录时出现Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES) 拒绝访问,并可修改MySQL密码
  16. BFC——块级格式化上下文
  17. 冰淇淋三明治 (Android 4.0)介绍
  18. MySQL新建用户保存的时报错:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
  19. Table-Driven Design 表驱动设计
  20. Hive—学习笔记(一)

热门文章

  1. python算法与数据结构-常用查找算法一(37)
  2. 大数据之路week06--day03(jdk8新特性 Lambda表达式)
  3. javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class com.javaliao.portal.model.TbLogVisit! T
  4. Linux 介绍与安装
  5. vim基本配置
  6. [USACO]骑马修栅栏 Riding the Fences
  7. 057_统计 Linux 进程相关数量信息
  8. 四十.创建Redis集群 管理集群
  9. learning scala Function Composition andThen
  10. Qt--解析Json