题目大意
x轴上有若干条不同线段,问某个单位区间[x,x+1]上重叠了多少条线段?
分析
为线段树每个节点增加一个Count域。表示所对应区间上重叠的线段数。思考线段树的构造方法:当某线段能够完整覆盖某个结点所对应的区间时,则不再二分。因
此要统计某个单位区间上重叠的线段总数,必须把从叶结点到根结点路径上所有结点的count域累加。然而没有数据,不知是否正确,还是放上来吧。
源代码/pas:
type
tree=record
l,r,c:longint;
end;
var
t:array[1..2002]of tree;
p:longint;
procedure build(f:longint);
var
mid:longint;
begin
if t[f].r-t[f].l>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;
build(f*2);
build(f*2+1);
end;
end;
procedure insert(f,x,y:longint);
var
mid:longint;
begin
mid:=(t[f].l+t[f].r)div 2;
if (x=t[f].l)and(y=t[f].r) then
inc(t[f].c)
else
if (y<=mid) then
insert(f*2,x,y)
else
if (x>=mid) then
insert(f*2+1,x,y)
else
begin
insert(f*2,x,mid);
insert(f*2+1,mid,y);
end;
end;
procedure find(f,x,y:longint);
var
mid:longint;
begin
mid:=(t[f].l+t[f].r)div 2;
if (x=t[f].l)and(y=t[f].r) then p:=f
else
if y<=mid then
find(f*2,x,y)
else
if x>=mid then
find(f*2+1,x,y)
else
begin
find(f*2,x,mid);
find(f*2+1,mid,y);
end;
end;
function count(f:longint):longint;
begin
count:=0;
while f>0 do
begin
count:=count+t[f].c;
f:=f div 2;
end;
end;
procedure init;
var
i,x,y,m:longint;
begin
readln(m);
t[1].l:=1;
t[1].r:=500;
build(1);
for i:=1 to m do
begin
readln(x,y);
insert(1,x,y);
end;
readln(x,y);
find(1,x,y);
writeln(count(p));
end;
begin
init;
end.