题目大意
桌子上零散地放着若干个不同颜色的盒子,桌子的后方是一堵墙。如右图所示。问从桌子前方可以看到多少个盒子?假设人站得足够远(自己设计测试数据,输入时,由底向上,从左
到右)。
样例输入
20 //桌面总宽度
4 //盒子数量
1 5
3 8
7 10
13 19
样例输出
15
思路:
简化题目得:x轴上有若干条不同颜色线段,求覆盖的不同颜色区间数量。同之前的题目一样,我们考虑给线段树每个节点增加一个域color。color=0表示该结点所对应的区间未被完
全覆盖,color<>0表示该结点所对应的区间被完全覆盖且颜色为color。最后用一个flag数组统计每种颜色是否出现过。累计求和。本题无数据,不知道是不是正解,但也放上来吧。
源代码/pas:
type
tree=record
l,r,c:longint;
end;
var
t:array[1..1000]of tree;
flag:array[0..1000]of longint;
procedure maketree(f:longint);
var
mid:longint;
begin
if t[f].l<>t[f].r-1 then
begin
mid:=(t[f].l+t[f].r)div 2;
t[f*2].l:=t[f].l;
t[f*2].r:=mid;
t[f*2+1].l:=mid;
t[f*2+1].r:=t[f].r;
maketree(f*2);
maketree(f*2+1);
end;
end;
procedure insert(f,x,y,color:longint);
var
mid:longint;
begin
if t[f].c=0 then
begin
mid:=(t[f].l+t[f].r)div 2;
if (t[f].l=x)and(t[f].r=y) then
t[f].c:=color
else
if (y<=mid) then
insert(f*2,x,y,color)
else
if (x>=mid) then
insert(f*2+1,x,y,color)
else
begin
insert(f*2,x,mid,color);
insert(f*2+1,mid,y,color);
end;
end;
end;
function count(f:longint):longint;
begin
if t[f].c<>0 then
flag[t[f].c]:=1
else
if t[f].r-t[f].l=0 then
exit
else
begin
count(f*2);
count(f*2+1);
end;
end;
procedure init;
var
n,m,i,u,v,ans:longint;
begin
readln(n);
readln(m);
t[1].l:=1;
t[1].r:=n;
maketree(1);
for i:=1 to m do
begin
readln(u,v);
insert(1,u,v,i);
end;
count(1);
ans:=0;
for i:=0 to m do
if flag[i]=1 then inc(ans);
writeln(ans);
end;
begin
init;
end.