PAT 甲级 1057 Stack
Posted benzikun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 甲级 1057 Stack相关的知识,希望对你有一定的参考价值。
最近开始写PAT了,20分值的题好多都是STL水过的模拟(STL要再好好看看了,要总结一下几种容器的函数用法,不能用一个查一个啊)
猛然写到这个题,用vector一通乱搞,A了第一个测试点,其它点T了,第一次在PAT上T,很是震惊(A了一个测试点竟然有15分......)
查了一下竟然用到了树状数组,又震惊了一下(PAT甲级有点猛)
先上代码,明天更新作法
#include <set> #include <map> #include <cmath> #include <queue> #include <stack> #include <string> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define inf 0x3f3f3f3f using namespace std; const int maxn=1e5+10; stack<int> s; int tree[maxn]; void update(int x,int k) { if(k==1) {for(;x<=maxn;x+=x & (-x)) tree[x]++;} else {for(;x<=maxn;x+=x & (-x)) tree[x]--;} } int query(int x) { int ans=0; for(;x>0;x-=x & (-x)) ans+=tree[x]; return ans; } int solve() { int l=1,r=maxn,sum=(s.size()+1)/2; while(l<r) { int mid=(l+r)>>1; if(query(mid)>=sum) r=mid; else l=mid+1; } return l; } int main() { int t; scanf("%d",&t); while(t--) { string str; cin>>str; if(str[1]==‘o‘) { if(s.size()==0) printf("Invalid "); else {int temp=s.top(); printf("%d ",temp); update(temp,2); s.pop();} } else if(str[1]==‘u‘) { int num; scanf("%d",&num); s.push(num); update(num,1); } else { if(s.size()==0) printf("Invalid "); else printf("%d ",solve()); } } return 0; }
以上是关于PAT 甲级 1057 Stack的主要内容,如果未能解决你的问题,请参考以下文章
PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****