第10章 线段树和树状数组
∮10.1 从一个实例入手
引例 线段覆盖问题
有一根长度为L的白色条状物。有两种操作:
用一条长度为T的黑布盖住条状物的[a, a+T]这个区间(0=a, T=L)。
把某条黑布拿走。
输入L和n次操作,要你输出每次操作之后:
条状物上有多少个黑区间。
条状物上黑区间的总长度。
分析1—线性表
见上图示,我们可以用一个数组来保存木板的状态。
Count : array[0 .. L+1] of Integer;
一开始Count数组的所有元素置0。
如果要添加一根布条(a, T),那么:
for i ( a to a+T-1 do
Count[i](Count[i]+1
如果要撤掉一根布条(a, T),那么:
for i ( a to a+T-1 do
Count[i](Count[i]-1
每次要输有多少个黑色区间可以这样做:
Count[L+1](0
Interval(0
for i(1 to L do
if (Count[i]0) and (Count[i+1]==0) then Interval ( Interval+1
Writeln(Interval)
每次要输出黑色区间的总长度:
Sum(0
for i(0 to L-1
if Count[i]0 then Sum(Sum+1
Writeln(Sum)
这种直观的做
原创力文档

文档评论(0)