桌子上零散地放着若干个不同颜色的盒子,桌子的后方是一堵墙。如右图所示。问从桌子前方可以看到多少个盒子?假设人站得足够远(自己设计测试数据,输入时,由底向上,从左到右)。
分析:用一个cover来记录每个区间的情况,tree[i--j].cover=n(n>0)表示i—j的颜色都是n;如果n=0,则没有盒子;如果n<0,则i—j有多种颜色即可。
具体见(http://blog.csdn.net/liangzihao1/article/details/51405107)
const
maxn=64;
type treenode=record
cover:longint;
end;
var
tree:array [0..maxn] of treenode;
n,total:longint;
flag:array [0..maxn] of integer;
procedure insert1(p,l,r,a,b,c:longint);
var
m:longint;
begin
if tree[p].cover<>c then
begin
m:=(l+r) div 2;
if (a=l) and (b=r) then
tree[p].cover:=c
else
begin
if tree[p].cover>=0 then
begin
tree[p*2].cover:=tree[p].cover;
tree[p*2+1].cover:=tree[p].cover;
tree[p].cover:=-1;
end;
if b<=m then insert1(p*2,l,m,a,b,c)
else if a>=m then
insert1(p*2+1,m,r,a,b,c)
else
begin
insert1(p*2,l,m,a,m,c);
insert1(p*2+1,m,r,m,b,c);
end;
end;
end;
end;
procedure cound(p,l,r:longint);
begin
if tree[p].cover>=0 then
flag[tree[p].cover]:=1
else if r-l>1 then
begin
Cound(p * 2, l, (l + r) div 2);
Cound(p * 2 + 1, (l + r) div 2, r);
end;
end;
procedure main;
var
i:integer;
a,b,l:integer;
begin
for i:=1 to maxn do tree[i].cover:=-1;
readln(l);
readln(n);
for i:=1 to n do
begin
readln(a,b);
insert1(1,1,l,a,b,i);
end;
cound(1,1,l);
end;
procedure print;
var
i:integer;
begin
for i:=0 to maxn do if flag[i]=1 theninc(total);
writeln(total);
end;
begin
main;
print;
end.