線段樹練習題二 線段樹

2021-09-26 07:56:01 字數 1742 閱讀 6817

>description

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

第一行輸入乙個整數n,表示桌面總寬度

第二行輸入乙個整數m,表示盒子數量

接下來m行,每行輸入兩個數x,y,表示第i個盒子的起始位置和終止位置

>output

陰影寬度

>sample input165

4 712 14

1 56 10

11 16

>sample output

4>解題思路

看了乙個晚上都沒a,早上手動模擬的時候發現我的儲存方式跟題目的不太一樣,在a上+1就a了,我(巨爺們不准我爆粗 )

也算模板題,插入時直接插入,就是樹的資料要修改一點,-1表示此區間有多種顏色,需要繼續搜下去。

查詢:用布林陣列y記錄第i種顏色有無出現。

>**

#include 

#include

using namespace std;

int n, m, a, b, ans, t[

400005];

bool c[

100005];

void

insert

(int d, int l, int r, int lf, int rf, int s)

//我不想解釋了你們應該都知道吧,s是顏色

if(t[d]

>0)

int mid =

(l + r)

>>1;

if(lf <= mid)

insert

(d *

2, l, mid, lf,

min(mid, rf)

, s);if

(rf > mid)

insert

(d *2+

1, mid +

1, r,

max(mid +

1, lf)

, rf, s)

; t[d]=-

1;//標記有多種顏色

}void

find

(int d, int l, int r)

if(l == r)

return

;//沒有子節點了就return

int mid =

(l + r)

>>1;

find

(d *

2, l, mid)

;find

(d *2+

1, mid +

1, r);}

int main()

find(1

,1, n)

;for

(int i =

1; i <= m; i++)if

(c[i]

) ans++

;printf

("%d"

, ans)

;return0;

}

線段樹練習題二

線段樹練習題二 description 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 分析 cover 0表示該區間由多種顏色組成。cover 0表示該區間只有一種單一的顏色cover,最後用個桶統...

線段樹 線段樹練習題二

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