1057. Stack

来源:互联网 发布:javascript 闭包 编辑:程序博客网 时间:2024/06/06 13:13

这个题网上都是用树形数组做的。要正确写出树形数组和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");      elseprintf("%d\n",lowerbd(1,N-1,(st.size()+1)>>1));    }//switch  }//while }


0 0
原创粉丝点击