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
- POJ 2892 Tunnel Warfare (树状数组+二分)
- 【poj 2892】Tunnel Warfare 二分+树状数组
- poj 2892 Tunnel Warfare(树状数组+二分)
- 【POJ 2892】 Tunnel Warfare(树状数组+二分)
- poj 2892 Tunnel Warfare(树状数组+二分)
- POJ-2892 Tunnel Warfare 树状数组
- POJ 2892 Tunnel Warfare [树状数组]
- 【HDU】Tunnel Warfare 树状数组+二分
- poj 2892 Tunnel Warfare(线段树#5/树状数组)
- poj 2892 Tunnel Warfare
- poj 2892 Tunnel Warfare
- poj 2892 Tunnel Warfare
- poj 2892 Tunnel Warfare
- POJ 2892 Tunnel Warfare
- poj 2892 Tunnel Warfare
- POJ 2892 Tunnel Warfare
- POJ 2892 Tunnel Warfare
- poj 2892Tunnel Warfare
- Linux文件权限
- Java里的文件和文件夹操作
- Linux assembly comiled successfully
- 完美结合LruCache和DiskLruCache实现Android照片墙
- 虚函数继承机制
- poj 2892 Tunnel Warfare(树状数组+二分)
- 很久没更新日志,这个日子有意义
- 《Pro git》学习笔记
- 链表中倒数第k个结点
- UIFramework之Unity4.x AssetBundle打包策略
- pagerank算法
- 格子问题
- 简单Java类实训四进阶篇(重难点)
- sdut_java_小学数学