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;
************************************************************************/
【代码】
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; }
相关文章推荐
- HDU 1540 Tunnel Warfare(线段树,去最大连续区间)
- HDU 1540 Tunnel Warfare(线段树 区间合并 最大连续区间)
- HDU - 1540 Tunnel Warfare(线段树最大连续区间)
- hdu 1540 线段树 点所在的区间最大连续长度
- hdu 1540 Tunnel Warfare(单点更新,取最大连续区间)★
- HDU 1540(线段树,以一点扩展开的最大连续区间)
- 文章标题 HDU 1540 : Tunnel Warfare (线段树+最大连续区间)
- hdu 1540 Tunnel Warfare (线段树维护左右最长连续区间)
- HDU1540 Tunnel Warfare(线段树:维护最大连续子串)
- hdu 1540 Tunnel Warfare(线段树 连续区间)
- 【维护区间最长连续子序列 && 线段树 && 区间归并】HDU - 1540 Tunnel Warfare
- Hdu 1540 求连续区间最大值的线段树
- HDU 1540 Tunnel Warfare (线段树区间合并)
- HDU 1540 Tunnel Warfare 线段树区间合并
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
- hdu 1540 Tunnel Warfare(线段树区间合并)
- poj 2892 hdu 1540Tunnel Warfare(poj 线段树 区间合并)
- HDU 1540 && POJ 2892 Tunnel Warfare (线段树,区间合并).
- hdu 1540 Tunnel Warfare (区间线段树(模板))
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并