PAT1057.Stack (30)

来源:互联网 发布:住宅设计优化 编辑:程序博客网 时间:2024/05/23 12:00

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1057

这题为浙大2013年考研复试上机的最后一题,分数值为30分,大部分人开始都会出现有几个case超时的状况,可能源于频繁的在PeekMedian操作时进行排序,导致了超时。

利用树状数组,辅之以普通的二分法,可以在限定的100ms内得到结果。树状数组的介绍

//#include"stdafx.h"#include<stdio.h>#include<cstring>#include<iostream>#include<string>using namespace std;const int N=100005;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;elsemedian=(l+r-1)/2;res=sum(median);if(res<value)l=median;else r=median;}return l+1;}int main(){//freopen("D://test.txt","r",stdin);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);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);elseres=find((top+1)/2);printf("%d\n",res);}else{printf("Invalid\n");}}return 0;}