不懂树状数组的童鞋,正好可以通过这道题学习一下树状数组~~百度有很多教程的,我就不赘述了

题意:有三种操作,分别是
1.Push key:将key压入stack
2.Pop:将栈顶元素取出栈
3.PeekMedian:返回stack中第(n+1)/2个小的数

建立一个栈来模拟push和pop,另外还需要树状数组,来统计栈中<=某个数的总个数
不了解树状数组的建议学习一下,很有用的。
树状数组为c,有个虚拟的a数组,a[i]表示i出现的次数
sum(i)就是统计a[1]~a[i]的和,即1~i出现的次数
当我要询问第k个数是多少时,那么我可以通过二分查找来找出第k个数
首先另l=min,r=max,这里min=1,max=100000,mid=(l+r)/2
如果k<=sum(mid),说明1~mid的总个数>=k,则第k个数肯定是在1~mid之间,所以r=mid
如果k>sum(mid),说明1~mid的总个数<k,则第k个数肯定是在mid~r之间,所以l=mid
最后到l与r相邻终止循环
此时如果sum(l)<k && k<=sum(r),说明第k个数即为多个r中的一个
否则的话,说明第k个数为多个l中的一个。

当执行push key的时候,update(key,1),即a[key]++,key出现的次数增加1
当执行pop的时候,update(key,-1),即a[key]--,key出现的次数减少1

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
#include <stack>
using namespace std;
const int maxn=+;
int n;
int c[maxn]; //树状数组
int lowbit(int x){
return x&(-x);
}
//树状数组的单点更新操作
void update(int i,int val){
while(i<maxn){
c[i]+=val;
i+=lowbit(i);
}
}
//树状数组的区间求和操作
int sum(int i){
int res=;
while(i){
res+=c[i];
i-=lowbit(i);
}
return res;
} int query(int cnt){
//二分查找哪个数是第cnt个大的
int l=,r=maxn-;
while(l<r-){
int mid=(l+r)>>;
//<=mid的数有sum(mid)个
if(cnt<=sum(mid)){
r=mid;
}
else{
l=mid;
}
}
if(sum(l)<cnt && cnt<=sum(r))
return r;
else
return l;
}
void test(){
int sizes=;
int a[]={,,,,,,};
for(int i=;i<sizes;i++){
update(a[i],);
}
int q;
while(scanf("%d",&q)!=EOF){
printf("%d\n",query(q));
}
}
int main()
{
char str[];
memset(c,,sizeof(c));
//test();
scanf("%d",&n);
stack<int>stacks;
int cnt=;
int tmp;
for(int i=;i<n;i++){
scanf("%s",str);
if(str[]=='o'){
if(cnt==)
printf("Invalid\n");
else{
tmp=stacks.top();
stacks.pop();
cnt--;
update(tmp,-);
printf("%d\n",tmp);
}
}
else if(str[]=='u'){
scanf("%d",&tmp);
stacks.push(tmp);
cnt++;
update(tmp,);
//printf("%d\n",tmp);
}
else{
if(cnt==)
printf("Invalid\n");
else{
int idx=(cnt+)/;
int ans=query(idx);
printf("%d\n",ans);
}
}
}
return ;
}

PAT甲级题解-1057. Stack (30)-树状数组的更多相关文章

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

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

  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【树状数组】【二分】

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

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

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

  5. 【PAT甲级】1057 Stack (30 分)(分块)

    题意: 输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数.(总数为偶数时输入偏小的) trick: 分块操作节约时间 AAAAAccepted code: ...

  6. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  7. PAT (Advanced Level) 1057. Stack (30)

    树状数组+二分. #include<iostream> #include<cstring> #include<cmath> #include<algorith ...

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

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

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

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

随机推荐

  1. SpringBoot部署

    Spring Boot 部署到服务器 jar 形式 1.打包 若我们在新建Spring Boot 项目的时候,选择打包方式是 jar,则我们只需要用 mvn package 就可以进行打包. 2.运行 ...

  2. FastDFS分布式文件系统设计原理

    转载自http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker ser ...

  3. 01-Angularjs开发环境搭建

    一.概述## 时下web前端非常热门,新的框架层出不穷,web前端的三驾马车VueJS.AngularJS.ReactJS发展非常迅猛.其中VueJS是国人开发的项目,百度热点趋势以1000%的速度在 ...

  4. InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClas...

    如果 你的项目中使用了注解插件 比如butterknife   升级3.1之后打包编译  出现以下错误提示 InnerClass annotations are missing correspondi ...

  5. php请求API接口方法

    thinkphp下直接放入公共函数即可. /** * 通过URL获取页面信息 * @param string $url 地址 * @return string 返回页面信息 */ function g ...

  6. 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...

  7. WorldWind源码剖析系列:插件列表视图类PluginListView和插件列表视图项类PluginListItem

    WorldWind中的插件类是个庞大的类,可以说从软件设计层面上统筹可扩展的插件体系的设计思想是WorldWind中的精华,值得学习和借鉴.插件体系中的所用到的类可以分为两大类,一类是插件类Plugi ...

  8. Docker学习5-Services – 服务(未完待续)

    扩展应用程序并启用负载平衡, 为此,必须在分布式应用程序的层次结构中提升一级:服务.在分布式应用程序中,应用程序的不同部分称为“服务”.例如,一个视频共享站点,它可能包含用于将应用程序数据存储在数据库 ...

  9. HDU 3861 The King’s Problem(tarjan缩点+最小路径覆盖:sig-最大二分匹配数,经典题)

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. HUE的安装

    HUE: Hadoop User Experience 官网地址:http://gethue.com/ Hue官网无法下载,超时. 使用CDH版本安装. 下载地址: http://archive.cl ...