您的位置:首页 > 其它

HDU 1540 Tunnel Warfare 【线段树--最大连续区间】

2010-08-13 14:03 561 查看
【题目地址】

http://acm.hdu.edu.cn/showproblem.php?pid=1540

【题目大意】

题目意思为有一系列村庄,然后对一些村庄进行破坏或修复。让你求与某村庄直接或间接相连且都没有破坏的村庄数量。

【解题思路】

/************************************************************************

此题线段树最经典的部分是更新部分,也是这题最难的部分,要考虑全面

线段树结构体定义两个变量 Lx,Rx

分别表示从左节点开始的长度,从右节点开始的长度

更新代码是关键:

if(tb[rt<<1].Lx==mid-L+1)tb[rt].Lx=tb[rt<<1].Lx+tb[rt<<1|1].Lx;

else tb[rt].Lx=tb[rt<<1].Lx;

if(tb[rt<<1|1].Rx==R-mid)tb[rt].Rx=tb[rt<<1|1].Rx+tb[rt<<1].Rx;

else tb[rt].Rx=tb[rt<<1|1].Rx;

************************************************************************/

【代码】

]#include <cstdio>

const int N=50005;
#define max(a,b) a>b?a:b

struct Node
{
int Lx,Rx;
int value;
}tb[N<<2];

void Build(int L,int R,int rt)
{
if(L==R){
tb[rt].Lx=tb[rt].Rx=1;
tb[rt].value=0;
return;
}
int mid=(L+R)>>1;
Build(L,mid,rt<<1);
Build(mid+1,R,rt<<1|1);
tb[rt].Lx=tb[rt].Rx=R-L+1;
}
void update(int x,int y,int L,int R,int rt){
if(R==L){
tb[rt].value=y;
if(y)tb[rt].Lx=tb[rt].Rx=0;
else tb[rt].Lx=tb[rt].Rx=1;
return;
}
int mid=(L+R)>>1;
if(x<=mid)update(x,y,L,mid,rt<<1);
else update(x,y,mid+1,R,rt<<1|1);

if(tb[rt<<1].Lx==mid-L+1)tb[rt].Lx=tb[rt<<1].Lx+tb[rt<<1|1].Lx;
else tb[rt].Lx=tb[rt<<1].Lx;

if(tb[rt<<1|1].Rx==R-mid)tb[rt].Rx=tb[rt<<1|1].Rx+tb[rt<<1].Rx;
else tb[rt].Rx=tb[rt<<1|1].Rx;
}

int query(int x,int L,int R,int rt){
if (L==R){
return tb[rt].value==0;
}
int mid=(R+L)>>1;
if (x<=mid){
if(x>mid-tb[rt<<1].Rx)return tb[rt<<1].Rx+tb[rt<<1|1].Lx;
else return query(x,L,mid,rt<<1);
}
else{
if(x<=mid+tb[rt<<1|1].Lx) return tb[rt<<1].Rx+tb[rt<<1|1].Lx;
else query(x,mid+1,R,rt<<1|1);
}
}

int main()
{
int n,m,i,v;
int stack
,top=0;
char op;
while(scanf("%d%d",&n,&m)!=EOF)
{
Build(1,n,1);
getchar();
for (i=1,top=0;i<=m;i++)
{
scanf("%c",&op);
if (op=='D')
{
scanf("%d",&v);
stack[top++]=v;
update(v,1,1,n,1);
}
else if(op=='R'){
if (top==0)continue;
update(stack[--top],0,1,n,1);
}
else{
scanf("%d",&v);
printf("%d/n",query(v,1,n,1));
}
getchar();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: