線段樹練習題二

2021-07-30 13:55:41 字數 1997 閱讀 5253

線段樹練習題二

description

桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠(輸入時,由底向上,從左到右)。 

分析

cover=0表示該區間由多種顏色組成。cover>0表示該區間只有一種單一的顏色cover,最後用個桶統計一下。注意:覆蓋時不能完全覆蓋的話要把該區間的cover變為0。

**

const

maxn=100000;

type

tnode=record

a,b:longint;

end;

vartree:array[0..maxn] of tnode;

cover:array[0..maxn] of longint;

f:array[0..maxn] of boolean;

i,j,n,m,ans,x,y:longint;

procedure create(p:longint);

varm:longint;

begin

if tree[p].b-tree[p].a>1 then

begin

m:=(tree[p].a+tree[p].b) div 2;

tree[p*2].a:=tree[p].a;

tree[p*2].b:=m;

tree[p*2+1].a:=m;

tree[p*2+1].b:=tree[p].b;

create(p*2);

create(p*2+1);

end;

end;

procedure insert(p,x,y,c:longint);

varm:longint;

begin

if cover[p]<>c then

begin

m:=(tree[p].a+tree[p].b) div 2;

if (x=tree[p].a) and (y=tree[p].b)

then cover[p]:=c

else begin

if cover[p]>0 then

begin

cover[p*2]:=cover[p];

cover[p*2+1]:=cover[p];

cover[p]:=0;

end;

if y<=m

then insert(p*2,x,y,c)

else if x>=m

then insert(p*2+1,x,y,c)

else begin

insert(p*2,x,m,c);

insert(p*2+1,m,y,c);

end;

end;

end;

end;

procedure count(p:longint);

varm:longint;

begin

if cover[p]>0

then f[cover[p]]:=true

else if tree[p].b-tree[p].a>1

then begin

count(p*2);

count(p*2+1);

end;

end;

begin

readln(m);

tree[1].a:=1;

tree[1].b:=m;

create(1);

readln(n);

for i:=1 to n do

begin

readln(x,y);

insert(1,x,y,i);

end;

count(1);

for i:=1 to n do

if f[i] then inc(ans);

writeln(ans);

end.

線段樹 線段樹練習題二

桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 input 第一行,乙個數m代表桌子長度 第二行,乙個數n代表盒子數量 第3到n 2行,每行兩個數,代表盒子的寬度 output 乙個數,可以看到的盒子...

線段樹 線段樹練習題二

桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 16 桌子長度 5 盒子數量 4 712 14 1 56 10 11 16 1 n 100000,1 m 100000,保證座標範圍為 1,n incl...

線段樹練習題二 線段樹

description 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 第一行輸入乙個整數n,表示桌面總寬度 第二行輸入乙個整數m,表示盒子數量 接下來m行,每行輸入兩個數x,y,表示第i個盒子的起始...