線段樹 線段樹練習題三

2021-09-26 08:25:12 字數 1477 閱讀 2839

題解。。。啊好煩懶得看,於是就拿線段樹練習題二改了。

給定一條長度為m的線段,有n個操作,每個操作有3個數字x,y,z表示把區間[x,y]染成顏色z,詢問染完色之後,這條長度為m的線段一共有幾種顏色。規定:線段的顏色可以相同。連續的相同顏色被視作一段。問x軸被分成多少段。

input

第一行,兩個數n,m分別代表運算元和代表初始線段長度

第2到n+1行,每行三個數,分別代表線段起始點,結束點,以及線段的顏色。

output

乙個數,是被分成的段數。

(初始線段為0號顏色,也算在答案之中)

sample input

4 20   //四條,總長度為20

10 19 1

2 9 2

5 13 3

15 17 4

sample output
7
線段樹,

d線段的左右節點分別為d2和d2+1。存的是d的左右兩半。

即如果d代表1-5,那麼d2代表1-3,d2+1代表3-5。

線段1為範圍。

本題用乙個color陣列存d線段的顏色狀態,>=0的數代表整個線段被那顏色覆蓋,==-1代表它下面有顏色。

搜的時候如果color[d] = =-1的話就往下搜,不然就處理當前顏色。

#include

#include

using

namespace std;

int color[

1000001];

//某段的顏色,-1代表多顏色

int n,m,color,ans,q,z,now=-1

;void

add(

int d,

int left,

int right,

int l,

int r)

if(color[d]

>=0)

int mid =

(left + right)

>>1;

if(r <= mid)

add(d <<

1, left, mid, l, r)

;//在左節點

else

if(l >= mid)

add(

(d <<1)

+1, mid, right, l, r)

;//在右節點

else

}void

find

(int d)

find

(d <<1)

;//左右搜

find

((d <<1)

+1);

}int

read()

return d;

}int

main()

find(1

);printf

("%d"

,ans)

;}

線段樹 線段樹練習題一

桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光,把盒子的影子投射到了牆上。問影子的總寬度是多少?第一行,乙個數m代表桌面寬度 第二行,乙個數n代表盒子數量 第2到n 2行,每行兩個數代表盒子開始與結束的位置 output 乙個數,影子的總寬度 sample...

線段樹 線段樹練習題二

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