题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1057
解题感悟:主要解决超时问题。参考网络大神解题报告,使用到了树形数组,膜拜
代码如下:
#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(){
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;
}