L3-002. 堆栈
来源:互联网 发布:不为谁而作的歌 知乎 编辑:程序博客网 时间:2024/05/19 02:22
大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。
输入格式:
输入第一行给出正整数N(<= 105)。随后N行,每行给出一个操作指令,为下列3种指令之一:
Push keyPop
PeekMedian
其中Push表示入栈,key是不超过105的正整数;Pop表示出栈;PeekMedian表示查中值。
输出格式:
对每个入栈指令,将key入栈,并不输出任何信息。对每个出栈或查中值的指令,在一行中打印相应的返回结果。若指令非法,就打印“Invalid”。
输入样例:17PopPeekMedianPush 3PeekMedianPush 2PeekMedianPush 1PeekMedianPopPopPush 5Push 4PeekMedianPopPopPopPop输出样例:
InvalidInvalid322124453Invalid思路:栈的模拟相信大家都会,不难。现在的难点就是寻找中值这个问题,发现对于这个时间限制,要想办法把查询更新操作降低到log2(n)。
嗯,某c~k带给我灵感,因为1E5不是很大,我们可以进行线段树单点更新,找中值其实就是找第mid个数。
所以我们可以更新1到1E5的每个数的个数,然后查询的时候找到第mid个数就可以了。
#include <bits/stdc++.h>using namespace std;const int MAXN=1e5+7;const int inf=1e9;int n,m,k;int num[MAXN];int sum[MAXN<<2];char s[20];void push_up(int i){ sum[i]=sum[i<<1]+sum[i<<1|1];}void updata(int i,int l,int r,int x,bool v){ if(l==r) { if(v)sum[i]++; else sum[i]--; return ; } int mid=(l+r)>>1; if(x<=mid)updata(i<<1,l,mid,x,v); else updata(i<<1|1,mid+1,r,x,v); push_up(i);}int ask(int i,int l,int r,int x){ if(l==r)return l; int mid=(l+r)>>1; if(x>sum[i<<1])return ask(i<<1|1,mid+1,r,x-sum[i<<1]); else return ask(i<<1,l,mid,x);}int main(){ scanf("%d",&n); int top=0; int x; for(int i=0;i<n;++i) { scanf("%s",s); if(s[1]=='u') { scanf("%d",&x); num[top++]=x; updata(1,1,100000,x,1); } else if(s[1]=='o') { if(!top)puts("Invalid"); else { printf("%d\n",num[--top]); updata(1,1,100000,num[top],0); } } else { if(!top)puts("Invalid"); else { printf("%d\n",ask(1,1,100000,(top+1)/2)); } } } return 0;}
0 0
- PAT L3-002. 堆栈
- L3-002. 堆栈
- L3-002. 堆栈
- L3-002. 堆栈(线段树)
- 线段树+L3-002. 堆栈
- L3-002. 堆栈_线段树 找第k大
- L3-002. 堆栈-PAT团体程序设计天梯赛GPLT(树状数组)
- 团体程序设计天梯赛-练习集-L3-002. 堆栈(线段树-区间第k大)
- gplt L3-002. 堆栈(单点更新求区间第k大)
- 团体程序设计天梯赛-练习集 L3-002. 堆栈 线段树 单点更新 解题报告
- L3-2. 堆栈(线段树)
- L3-2. 堆栈(线段树单点更新)
- 团体程序设计天梯赛L3-002 堆栈
- L3-002 堆栈 树状数组+二分答案
- L3
- L3-2堆栈 团体程序设计天梯赛-练习集
- PAT-4C-L3-002-堆栈(线段树)
- ACM天梯赛 L3-02 堆栈(线段树)
- 网站建设的一点一滴——JavaWeb
- A.单词反转
- 嵌入式Linux开发介绍
- Oracle
- 2017面试题大汇总
- L3-002. 堆栈
- jquery 书写全选反选功能
- 回溯算法概括
- OpenGL画点
- 几种常见较经典的显著性检测算法
- Unix环境高级编程第三版中apue.h头文件如何配置
- Java——进程
- 【量化入门】通过几种常见的量化策略框架,学习量化炒股
- [BZOJ1415][Noi2005]聪聪和可可(bfs+概率期望+记搜)