标签:
---恢复内容开始---
Tunnel Warfare
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
Sample Output
#include"cstdio" #include"algorithm" using namespace std; const int MAXN=50005; struct node{ int l,r; int ll,rl,ml; }a[MAXN*3]; void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; a[rt].ll=a[rt].rl=a[rt].ml=r-l+1; if(l==r) return ; int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); } void merge(int rt) { //若左子树已满,则应与右子树左区间合并 a[rt].ll=a[rt<<1].ll; if(a[rt<<1].ll==(a[rt<<1].r-a[rt<<1].l+1)) { a[rt].ll+=a[(rt<<1)|1].ll; } //若右子树已满,则应与左子树的有区间合并 a[rt].rl=a[(rt<<1)|1].rl; if(a[(rt<<1)|1].rl==(a[(rt<<1)|1].r-a[(rt<<1)|1].l+1)) { a[rt].rl+=a[rt<<1].rl; } //该子树的最大连续长度为 左或右子树连续长度的最大者 或者 将左子树右区间与右子树左区间合并的长度 a[rt].ml=max(max(a[rt<<1].ml,a[(rt<<1)|1].ml),a[rt<<1].rl+a[(rt<<1)|1].ll); } void update(int rt,int pos,int val) { if(a[rt].l==a[rt].r) { if(val) a[rt].ll=a[rt].rl=a[rt].ml=1; else a[rt].ll=a[rt].rl=a[rt].ml=0; return ; } int mid=(a[rt].l+a[rt].r)>>1; if(pos<=mid) update(rt<<1,pos,val); else update((rt<<1)|1,pos,val); merge(rt); } int query(int rt,int pos) { if(a[rt].l==a[rt].r||a[rt].ml==0||a[rt].ml==a[rt].r-a[rt].l+1)//到达叶子节点或者该节点已满或空,那么不必向下走了 { return a[rt].ml; } int mid=(a[rt].l+a[rt].r)>>1; if(pos<=mid)//在左子树中 { if(pos>=a[rt<<1].r-a[rt<<1].rl+1)//若在左子树的右区间 { return query(rt<<1,pos)+query((rt<<1)|1,mid+1);//则需要查询右子树 } else { return query(rt<<1,pos); } } else { if(pos<=a[(rt<<1)|1].l+a[(rt<<1)|1].ll-1)//若在右子树的左区间 { return query((rt<<1)|1,pos)+query(rt<<1,mid);//则需要查询左子树 } else { return query((rt<<1)|1,pos); } } } int stack[MAXN]; int top; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int pos; top=0; build(1,1,n); while(m--) { scanf("%*c"); char op;scanf("%c",&op); if(op==‘D‘) { scanf("%d",&pos); stack[top++]=pos; update(1,pos,0); } else if(op==‘Q‘) { scanf("%d",&pos); printf("%d\n",query(1,pos)); } else { pos=stack[--top]; update(1,pos,1); } } } }
---恢复内容结束---
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5125995.html