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

来源:互联网 发布:网络语言tr是什么意思 编辑:程序博客网 时间:2024/05/21 17:02

#include<iostream>#include<math.h>#include<cstdio>#include<stdlib.h>#include<cstring>using namespace std; #define N 55010int c[N],a[N],v[N];int lowbit(int x){    return x&(-x);}void add(int x,int d){    while(x<N)    {        c[x]+=d;        x+=lowbit(x);    }}int sum(int x){    int ans=0;    while(x>0)    {        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;}


0 0
原创粉丝点击