桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?
题解:
给线段树每个节点增加一个域cover。cover=1表示该结点所对应的区间被完全覆盖,cover=0表示该结点所对应的区间未被完全覆盖。
代码:
if s[p].cover=0 then
begin
m:=(s[p].b+s[p].e) div 2;
if (a=s[p].b)and(b=s[p].e) then
s[p].cover:=1
else if b<=m then insert(p*2,a,b)
else if a>=m then insert(p*2+1,a,b)
else begin
insert(p*2,a,m);
insert(p*2+1,m,b);
end;
end;