题目如下:

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 N is 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 (<= 105). 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 105.

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

这个题目我最初用的是string、stringstream和vector来做,发现会严重超时,后来在网上参考了和山米兰的解法,发现他的方法很有技巧,分析如下:

①对命令的解析,只看第二位,如果是o,说明是Pop,如果是e,说明是PeekMedian,否则是push,是push则应当再读入一次数字,这比用getline要好的多,因为getline还需要排除第一个输入的N。

②求中位数的思想,不是排序找中间的值,而是通过统计从1开始的每个元素的个数放到数组C中,这样从前到后,数组C的子列和为题目要求的位置时,拿到的就是中位数。

③求子列和的思想,因为是从前到后的前缀和,可以利用树状数组,下面的代码利用add实现了添加和删除两种操作,利用value的不同,1表示添加,2表示删除。树状数组的基本思想就是数组C中不同元素管辖不同的区域,如果要添加一个元素,则所有满足区域条件的位置都要+value,反之如果删除,所有满足条件的区域都要-value。本题要求的是统计1~100000的元素个数,因此value=+1或者-1。

④求子列和为题目要求的值,利用二分查找。

#include<stdio.h>
#include<cstring>
#include<iostream>
#include<string>
using namespace std; const int N=100001;
int c[N]; int lowbit(int i){
return i&(-i);
} void add(int pos,int value){
while(pos<N){
c[pos]+=value;
pos+=lowbit(pos);
}
} int sum(int pos){
int res=0;
while(pos>0){
res+=c[pos];
pos-=lowbit(pos);
}
return res;
} int find(int value){
int l=0,r=N-1,median,res;
while(l<r-1){
if((l+r)%2==0)
median=(l+r)/2;
else
median=(l+r-1)/2;
res=sum(median);
if(res<value)
l = median;
else
r = median; }
return l+1;
} int main(){
char ss[20];
int stack[N],top=0,n,pos;
memset(c,0,sizeof(c));
scanf("%d",&n);
while(n--){
scanf("%s",ss);
if(ss[1]=='u'){
scanf("%d",&pos);
stack[++top]=pos;
add(pos,1);
}else if(ss[1]=='o'){
if(top==0){
printf("Invalid\n");
continue;
}
int out=stack[top];
add(out,-1); // 删除元素out
printf("%d\n",stack[top--]);
}else if(ss[1]=='e'){
if(top==0){
printf("Invalid\n");
continue;
}
int res;
if(top%2==0)
res=find(top/2);
else
res=find((top+1)/2);
printf("%d\n",res); }else{
printf("Invalid\n");
}
} return 0;
}

1057. Stack (30) - 树状数组的更多相关文章

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

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

  2. pat 甲级 1057 Stack(30) (树状数组+二分)

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

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

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

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

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

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

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

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

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

  7. POJ1990--POJ 1990 MooFest(树状数组)

    Time Limit: 1000MSMemory Limit: 30000K Total Submissions: 8141Accepted: 3674 Description Every year, ...

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

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

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

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

随机推荐

  1. mysql免安装版下载及配置教程

    第一步:下载 下载地址:http://dev.mysql.com/downloads/mysql/ 滚动到下方就能看到了,根据自己的需求下载: 我的电脑为64为的所以下载的为 Windows (x86 ...

  2. python2.7练习小例子(三)

        3):题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?     程序分析:假设该数为 x.1.则:x + 100 = n2, x + 100 + ...

  3. 360面试-C++后端(实习)

    在线远程视频面试 一面: 自我介绍. 知道哪几种排序算法,各算法的时间复杂度. 解决hash冲突的几种方式. 有哪些方法清除cache中旧的数据.不太清楚,我扯到了操作系统中缺页中断的页面置换原理上, ...

  4. Android.mk 详解

    Android中增加本地程序或者库,这些程序与其所在路径没有关系,只和它们的Android.mk有关系. Android.mk与普通的makefile略有不同,Android.mk具有统一的写法,主要 ...

  5. 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼

    我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...

  6. Spring Cloud 服务端注册与客户端调用

    Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...

  7. c++ 隐藏

    子类中写了一个与从父类中继承下来的方法名同名的方法 子类对象.方法();                    //调用子类中定义的方法 父类对象.方法();                    / ...

  8. 如何去掉修改Joomla、joomlart及其模版版权、标志、图标的方法

    Joomla是遵循GNU通用公共授权(GPL)的自由软件,我们虽然不推荐将Joomla的所有版权删除,但有些必要的信息还是需要修改的,下面以JoomlArt.com 的JA_teline_iii_v2 ...

  9. MongoDB 监控

    在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能.这样在大流量得情况下可以很好的应对并保证MongoDB正常运作. MongoDB中提供了m ...

  10. PHP HTTP 函数

    PHP HTTP 简介 HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. 安装 HTTP 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP ...