题目地址: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; else median=(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); else res=find((top+1)/2); printf("%d\n",res); }else{ printf("Invalid\n"); } } return 0; }