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