線段樹練習題三 線段樹

2021-09-26 08:16:58 字數 1693 閱讀 5658

>description

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

第一行輸入兩個整數n,m,表示有n個操作,長度為m的線段

接下來n行,每行輸入三個整數a,b,c,表示區間a~b染上顏色c

>output

輸出長度為m的線段一共有幾種顏色(沒有染上顏色的地方也算一種顏色)

>sample input

4 20

10 19 1

2 9 2

5 13 3

15 17 4

>sample output

7n <= 10000

m <= 1000000

>解題思路

原題的樣例輸入搞錯了搞得我做了半個早上乙個下午

又是模板題,查詢時用乙個變數last來記錄上一段貢獻答案的是什麼顏色,如果和當前節點的顏色一樣就不貢獻答案,不一樣就貢獻1。

>**

#include 

#include

#include

using namespace std;

int n, m, last, a, b, c, t[

4000005];

void

insert

(int d, int l, int r, int lf, int rf, int 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;//標記有多種顏色

}int find

(int d, int l, int r)

if(l == r)

return0;

//沒有兒子的話就return

int mid =

(l + r)

>>1;

return

find

(d *

2, l, mid)

+find

(d *2+

1, mid +

1, r);}

int main()

last =-1

;printf

("%d"

,find(1

,2, m));

return0;

}

線段樹練習題三(線段樹)

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

線段樹練習題三

time limit 10000ms memory limit 65536k total submit 143 accepted 45 case time limit 1000ms description 給定一條長度為m mm的線段,有n nn個操作,每個操作有3 33個數字x,y z x,y,z...

線段樹 線段樹練習題三

題解。啊好煩懶得看,於是就拿線段樹練習題二改了。給定一條長度為m的線段,有n個操作,每個操作有3個數字x,y,z表示把區間 x,y 染成顏色z,詢問染完色之後,這條長度為m的線段一共有幾種顏色。規定 線段的顏色可以相同。連續的相同顏色被視作一段。問x軸被分成多少段。input 第一行,兩個數n,m分...