PAT甲级题解-1057. Stack (30)-树状数组
不懂树状数组的童鞋,正好可以通过这道题学习一下树状数组~~百度有很多教程的,我就不赘述了
题意:有三种操作,分别是
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)-树状数组的更多相关文章
- 1057. Stack (30) - 树状数组
题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...
- pat 甲级 1057 Stack(30) (树状数组+二分)
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the princi ...
- PAT甲级1057 Stack【树状数组】【二分】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592 题意:对一个栈进行push, pop和 ...
- PAT 1057 Stack [难][树状数组]
1057 Stack (30)(30 分) Stack is one of the most fundamental data structures, which is based on the pr ...
- 【PAT甲级】1057 Stack (30 分)(分块)
题意: 输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数.(总数为偶数时输入偏小的) trick: 分块操作节约时间 AAAAAccepted code: ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- PAT (Advanced Level) 1057. Stack (30)
树状数组+二分. #include<iostream> #include<cstring> #include<cmath> #include<algorith ...
- PAT-1057 Stack (树状数组 + 二分查找)
1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...
- PAT1057 Stack(树状数组+倍增)
目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈 ...
随机推荐
- beta冲刺————第一天(1/5)
人员的再次分配: 调走人员:陈裕鹏(原来在本队伍主要进行文章推荐算法的设计) 调入人员:陈邡(原Dipper团队,负责游戏内容的策划案,以及做一些后端的探索工作.) 现队员工作划分: 王国华,吴君毅, ...
- SSL/TLS Diffie-Hellman Modulus <= 1024 位 (LogJam) 使用2048位或更高的Diffie-Hellman
1.http://slproweb.com/products/Win32OpenSSL.html 下载 SSL 并安装 2.设置环境变量,例如工具安装在C:\OpenSSL-Win64,则将C:\O ...
- wx.aui.AuiManager部分/布局翻译
wx.aui.AuiManager wx.aui.AuiManager 是AUI框架类中的主要类 wx.aui.AuiManager管理于指定的wx.Frame相关联的窗口,通过使用窗口的wx.aui ...
- 2019 Web开发学习路线图
以下 Web 开发人员学习路线图是来自 Github developer-roadmap 项目,目前已经有繁体版翻译 developer-roadmap-chinese. 主要有三个方向,分别为前端开 ...
- JS中 map, filter, some, every, forEach, for in, for of 用法总结
本文转载自:http://blog.csdn.net/gis_swb/article/details/52297343 1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let ...
- HTML5新特性postMessage解决跨域
window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息.基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信.让我们来看一下 ...
- 洛谷P1803
#include <iostream>#include <algorithm>#include <cstdio>using namespace std; struc ...
- python第二十九课——文件读写(读取数据操作)
演示读取数据操作:path=r'a.txt' 1.打开文件f1=open(path,'r') 2.读取数据content1=f1.read(3)print(content1) content1=f1. ...
- memcached未授权
memcached未授权 漏洞成因: Memcached端口是对外开放的,用nc或Telne可以直接登录,查看信息,增加修改都可以. nc -vv 1.2.3.4 11211 telnet 1.2.3 ...
- 使用 zTree 右键菜单功能的总结
一: 首先什么是zTree? zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点.专门适合项目开发,尤其是 树状菜单.树状 ...