题目大意:
桌子上零散地放着若干个不同颜色的盒子,桌子的后方是一堵墙。如右图所示。问从桌子前方可以看到多少个盒子?假设人站得足够远(自己设计测试数据,输入时,由底向上,从左到右)。
题解
可以这样来看这道题:x轴上有若干条不同线段,将它们依次染上不同的颜色,问最后能看到多少种不同的颜色?
我们可以这样规定:x轴初始是颜色0,第一条线段染颜色1,第二条线段染颜色2,以此类推。
原先构造线段树的方法不再适用,但是我们可以通过修改线段树的cover域的定义,使得这道题也能用线段树来解。
定义cover如下:cover=-1表示该区间由多种颜色组成。cover>=0表示该区间只有一种单一的颜色cover。
代码:
这题统计中与例1有些小区别:
使用一个数组Flag,初始化为0。遍历线段树,对于每种颜色c对Flag[c]赋值1。最后统计Flag中1的个数即可。(注意颜色0应该排除在外,可以在最后减1)
if Tree[p].cover >= 0
then Flag[Tree[p].cover] := 1
else if r - l > 1
then begin
Count(p * 2, l, (l + r) div 2);
Count(p * 2 + 1, (l + r) div 2, r);
end;
then Flag[Tree[p].cover] := 1
else if r - l > 1
then begin
Count(p * 2, l, (l + r) div 2);
Count(p * 2 + 1, (l + r) div 2, r);
end;