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 (N/2)-th smallest element if Nis even, or ((N+1)/2)-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 (≤10​5​​). Then Nlines follow, each contains a command in one of the following 3 formats:

where key is a positive integer no more than 10​5​​.

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.

知识点:树状数组,二分查找

二分查找的写法

对比两种写法:

正确:


find(x){
while(l!=r){
mid=(l+r)/2;
if(list[mid]>=x){
r=mid;
}else{
l=mid+1;
}
}
}

错误:

find(x){
while(l!=r){
mid=(l+r)/2;
if(list[mid]>x){
r=mid-1;
}else{
l=mid;
}
}
}

 #include <iostream>
#include <stack>
using namespace std;
const int maxn = ; int n;
int c[maxn];
stack<int> st; int lowbit(int v){ // lowbit()函数取二进制数最后一个1
return v&(-v);
} 15 int getSum(int x){ // 往前加和
16 int sum=0;
17 for(int i=x;i>0;i-=lowbit(i)){
18 sum += c[i];
19 }
20 return sum;
21 } void upDate(int v,int p){ // 往后更新
for(int i=v;i<maxn;i+=lowbit(i)){
c[i]+=p;
}
} int findMid(){
printf("\n");
int mid=(st.size()+)/;
int l=, r=maxn-;
int cnt=;
while(l!=r&cnt<){ // 二分查找
cnt++;
printf("* %d %d\n",l,r);
int m=(l+r)/;
if(getSum(m)>=mid){
r=m;
}else{
l=m+;
}
}
return l;
} int main(int argc, char *argv[]) {
fill(c,c+maxn,); scanf("%d",&n);
char cmd[]; int key;
for(int i=;i<n;i++){
scanf("%s",cmd);
if(cmd[]=='u'){
scanf("%d",&key); st.push(key);
upDate(key,);
}else if(cmd[]=='o'){
if(st.size()==) printf("Invalid\n");
else{
upDate(st.top(),-);
printf("%d\n",st.top());
st.pop();
}
}else if(cmd[]=='e'){
if(st.size()==) printf("Invalid\n");
else{
printf("%d\n",findMid());
};
}
}
}

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

1057 Stack 树状数组的更多相关文章

  1. PAT 1057 Stack [难][树状数组]

    1057 Stack (30)(30 分) Stack is one of the most fundamental data structures, which is based on the pr ...

  2. PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

    1057 Stack (30 分)   Stack is one of the most fundamental data structures, which is based on the prin ...

  3. 1057. Stack (30) - 树状数组

    题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...

  4. PAT甲级1057 Stack【树状数组】【二分】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592 题意:对一个栈进行push, pop和 ...

  5. PAT甲级题解-1057. Stack (30)-树状数组

    不懂树状数组的童鞋,正好可以通过这道题学习一下树状数组~~百度有很多教程的,我就不赘述了 题意:有三种操作,分别是1.Push key:将key压入stack2.Pop:将栈顶元素取出栈3.PeekM ...

  6. 1057 Stack (30分)(树状数组+二分)

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  7. PAT-1057 Stack (树状数组 + 二分查找)

    1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...

  8. PAT1057 Stack(树状数组+倍增)

    目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈 ...

  9. UVA 1513 Movie collection (树状数组+反向存储)

    题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...

随机推荐

  1. jquery字符串相等判断

    在jquery中字符串相等判断一直失败 原来是空格! string1, string2 若其中有一个为返回值或类似 $.trim(string1) == $.trim(string2) ------- ...

  2. power designer 从sqlserver数据库获取字段说明&导出rtf文档模板

    具体的操作稍后在修改 附件下载:https://files.cnblogs.com/files/zinan/powerDesigner.rar

  3. PopupWindow与Edittext结合使用所遇到的坑

    PopupWindow与Edittext结合使用一起实现目的:既可以编辑输入想要的内容,还可以通过下拉列表来实现内容的选择. 我就是这样的一个目的,结果很简单的目的却遇到了很大的坑,下面我将把我遇到的 ...

  4. C# 使用printDocument1.Print打印时不显示 正在打印对话框

    C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController       PrintController printControll ...

  5. poj 2828(线段树 逆向思考) 插队是不好的行为

    http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...

  6. hdu 1394(线段树) 最小逆序数

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数 线段树的应 ...

  7. Spring PropertyResolver 占位符解析(一)API 介绍

    Spring PropertyResolver 占位符解析(一)API 介绍 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  8. option_match

    //与match区别:如果没有匹配到,返回NULLCREATE (olive:Person {name:'Olive Stone'}),(charlie:Person {name:'Charlie S ...

  9. mybatis 操作数据错误Truncated incorrect DOUBLE value: ''

    网上查到遇到次错误造成的原因: UPDATE TSYS_ROLE_RIGHTSET ACTIVE_FLAG = '2' and UPDATE_PERSON = 'CaiYiHua' and  UPDA ...

  10. web API分类

    什么是Web API? Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 分类 ...