poj 2892 Tunnel Warfare(树状数组+二分)

#include
#include
#include
#include
#include
using namespace std;
 #define N 55010
int c[N],a[N],v[N];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int d)
{
    while(x0)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
   int n,m;
   scanf("%d%d",&n,&m);
   memset(v,0,sizeof(v));
   memset(c,0,sizeof(c));
   for(int i=1;i<=n;i++)
    add(i,1);
   int k=0,b;
   while(m--)
   {
       getchar();
       char s;
       scanf("%c",&s);
       if(s=='D')
       {
           scanf("%d",&b);
           if(v[b]==0)
           {
               v[b]=1;
               add(b,-1);
               a[k++]=b;
           }
       }
       else if(s=='R')
       {
           if(k)
           {v[a[--k]]=0;
           add(a[k],1);}
       }
       else if(s=='Q')
       {
           scanf("%d",&b);
           if(v[b]==1){puts("0");continue;}
           int l,r,mid,x,y;
            l=0;r=b;
           while(l<=r)
           {
               mid=(l+r)/2;
               if(sum(b)-sum(mid)==(b-mid))//sum(a)-sum(b)代表a+1到b的和所以下面的x=mid+1
               {
                   x=mid+1;
                   r=mid-1;
               }else l=mid+1;
           }
           l=b-1;r=n;
           while(l<=r)
           {
               mid=(l+r)/2;
               if(sum(mid)-sum(b-1)==(mid+1-b))//y=mid
               {
                   y=mid;
                   l=mid+1;
               }else r=mid-1;
           }
           printf("%d\n",y-x+1);
       }
   }
    return 0;
}


你可能感兴趣的:(ACM-树状数组)