线段树和树状数组重点.doc

第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)

1亿VIP精品文档

相关文档