題目大意:
n長度的桌子上零散地放著m個不同顏色的盒子,桌子的後方是一堵牆。給出每個箱子的左端跟右端,問從桌子前方可以看到多少個盒子?假設人站得足夠遠(輸入時,由底向上,從左到右)。
1<=n<=100000,1<=m<=100000,保證座標[l,r]範圍為[1,n].
題解:
線段樹:
跟zju的那道題一樣,
不過把記錄數量變成了記錄是否存在。
var
ans,tree:array [0..300000] of longint;
sum,i,n,m,a,b,c:longint;
procedure
insert
(p,l,r,a,b:longint);
var mid:longint;
begin
mid:=(l+r) div
2; if (a=l) and (b=r)
then tree[p]:=c
else
begin
if tree[p]<>-1
then
begin
tree[p * 2]:=tree[p];
tree[p*2+1]:=tree[p];
tree[p]:=-1;
end;
if b<=mid then insert(p*2,l,mid,a,b)
else
if a>=mid then insert(p*2+1,mid,r,a,b)
else
begin
insert(p * 2,l,mid,a,mid);
insert(p*2+1,mid,r,mid,b);
end;
end;
end;
procedure
count
(p,l,r:longint);
var mid:longint;
begin
mid:=(l+r) div
2; if tree[p]=-2
then
begin
c:=-2;
exit;
endelse
if (tree[p]<>c) and (tree[p]<>-1)
then
begin
c:=tree[p];
ans[c]:=1;
endelse
if (r-l=1) and (c=tree[p])
then
exit
else
if tree[p]=-1
then
begin
count(p * 2,l,mid);
count(p*2+1,mid,r);
end;
end;
procedure
print;
begin
for i:=1
to n do
if ans[i]=1
then inc(sum);
writeln(sum);
end;
begin
for i:=0
to300000
do tree[i]:=-2;
readln(n);
readln(m);
for i:=1
to m do
begin
readln(a,b);
c:=i;
insert(1,1,n,a,b);
end;
c:=-3;
count(1,1,n);
print;
end.
2645 線段樹練習題二
桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 可以把每個盒子看成一種顏色的線段,後塗的線段可以覆蓋前面的,原來的顏色為0,問最後這條直線上有多少種顏色的線段 原先構造線段樹的方法不再適用,但是我們可...
SSLGZ 2645 線段樹練習題二
問題描述 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 樣例輸入 16 桌子長度 5 盒子數量 4 7 12 14 1 5 6 10 11 16 樣例輸出 4演算法討論 構建線段樹,我們定義區間標記...
SSL P2644 線段樹練習題一
題目大意 乙個n長度的桌面上有m個箱子,給出每個箱子所佔的寬度最左端,最右端 l,r 從桌子的前方射來一束平行光,把盒子的影子投射到了牆上。求影子的總寬度。資料範圍 1 n 100000,1 m 100000 1 l r n 題解 線段樹 1.建乙個線段樹,如果 a,b 區間在 l,r 區間內,並且...