1057. Stack

这个题网上都是用树形数组做的。要正确写出树形数组和lower_bound的代码。用树形数组关键是0这个下标是不能用的,因为lowerbit(0)为0会死循环,因此用lower_bound(l,r,x)查找时l不能从0而应从1开始。

#include<stack>
#include<iostream>
using namespace std;
const int N=100003;
stack<int>st;
int sm[N];
int lowbit(int x){
  return (-x)&x;
}
void chg(int i,int x){
  while(i<N) sm[i]+=x,val[i]=sm[i],i+=lowbit(i);
}
int sum(int i){
  int ret=0;
  while(i>=1) ret+=sm[i],i-=lowbit(i);
  return ret;
}
int lowerbd(int l,int r,int x){
  while(l<=r){
    int m=(l+r)>>1;
    sum(m)>=x?r=m-1:l=m+1;}
  return l;
}
int main(){
  int cnt;scanf("%d",&cnt);
  while(cnt--){
    char s[40];scanf("%s",s);
    switch(s[1]){
    case 'o':
      if(st.empty())printf("Invalid\n");
      else {
	printf("%d\n",st.top());
	chg(st.top(),-1);
	st.pop();}
      break;
    case 'u':
      int val;
      scanf("%d",&val);
      chg(val,1);
      st.push(val);
      break;
    case 'e':
      if(st.empty())
	printf("Invalid\n");
      else
	printf("%d\n",lowerbd(1,N-1,(st.size()+1)>>1));
    }//switch
  }//while 
}



你可能感兴趣的:(1057. Stack)