>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...