您的位置:首页 > 其它

poj 2892 &&hdu 1540 Tunnel Warfare

2014-02-20 10:17 459 查看
http://poj.org/problem?id=2892

#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 51000
using namespace std;

int stack1[maxn],top;
struct node
{
int l,r;
int len,ren;
}p[maxn*4];

void up(int i)
{
p[i].len=p[i<<1].len; p[i].ren=p[i<<1|1].ren;
if(p[i<<1].len==(p[i<<1].r-p[i<<1].l+1))
p[i].len+=p[i<<1|1].len;
if(p[i<<1|1].ren==(p[i<<1|1].r-p[i<<1|1].l+1))
p[i].ren+=p[i<<1].ren;
}
void build_tree(int i,int l,int r)
{
p[i].l=l; p[i].r=r;
if(l==r)
{
p[i].len=p[i].ren=1;
return ;
}
int mid=(l+r)>>1;
build_tree(i<<1,l,mid);
build_tree(i<<1|1,mid+1,r);
up(i);
}

void update(int id,int i,int oper)
{
if(p[i].l==p[i].r)
{
p[i].len=p[i].ren=oper;
return;
}
int mid=(p[i].l+p[i].r)>>1;
if(id<=mid)
update(id,i<<1,oper);
else
update(id,i<<1|1,oper);
up(i);
}

int search1(int id,int i)
{
if(p[i].l==p[i].r)
return p[i].len;
int mid=(p[i].l+p[i].r)>>1;
if(id<=mid)
{
if(p[i<<1].r-p[i<<1].ren+1<=id)
return p[i<<1].ren+p[i<<1|1].len;
else
search1(id,i<<1);
}
else
{
if(p[i<<1|1].len+p[i<<1|1].l-1>=id)
return p[i<<1].ren+p[i<<1|1].len;
else
search1(id,i<<1|1);
}
}

int main()
{
int n,q,a;
while(scanf("%d%d",&n,&q)!=EOF)
{
build_tree(1,1,n);
top=1;
getchar();
while(q--)
{
char ch;
scanf("%c",&ch);
if(ch=='D')
{
scanf("%d",&a);
update(a,1,0);
stack1[top++]=a;
}
else if(ch=='Q')
{
scanf("%d",&a);
printf("%d\n",search1(a,1));
}
else if(ch=='R')
{
if(top>1)
{
update(stack1[--top],1,1);
}
}
getchar();
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: