SSL P2645 線段樹練習題二

2021-07-30 13:13:00 字數 1871 閱讀 7229

題目大意:

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 區間內,並且...