線段樹線段覆蓋(離散化 區間覆蓋)

2022-06-19 08:09:11 字數 2748 閱讀 4446

n(n<=10000) 個人依次貼海報,給出每張海報所貼的範圍li,ri(1<=li<=ri<=10000000) 。求出最後還能看見多少張海報。

input

第一行: 樣例個數t

第二行: 貼海報的人n

第三行: 每個人貼海報的範圍

接下來n行: 每個人貼海報的範圍

output

對於每乙個輸入,輸出最後可以看到的海報張數。下面這個圖是樣例解釋

這個題如果你用普通的離散化,是錯的

如三張海報為:1~10 1~4 6~10離散化時 x[ 1 ] = 1, x[ 2 ] = 4, x[ 3 ] = 6, x[ 4 ] = 10第一張海報時:牆的1~4被染為1;第二張海報時:牆的1~2被染為2,3~4仍為1;

第三張海報時:牆的3~4被染為3,1~2仍為2。

最終,第一張海報就顯示被完全覆蓋了,於是輸出2,但實際上明顯不是這樣,正確輸出為3。

新的離散方法為:在相差大於1的數間加乙個數,例如在上面1 4 6 10中間加5(演算法中實際上1,4之間,6,10之間都新增了數的)

x[ 1 ] = 1, x[ 2 ] = 4, x[ 3 ] = 5, x[ 4 ] = 6, x[ 5 ] = 10

這樣之後,第一次是1~5被染成1;第二次1~2被染成2;第三次4~5被染成3

最終,1~2為2,3為1,4~5為3,於是輸出正確結果3。

for(int i=1;i<=n;i++)    

sort(lsh+1,lsh+cnt+1

);

int mm=unique(lsh+1,lsh+cnt+1)-(lsh+1

);

int nn=mm;

for(int i=2;i<=nn;i++)

}sort(lsh+1,lsh+mm+1);

離散化之後就是線段樹區間修改,和單點查詢

建樹修改+查詢

build(1,1

,mm);

for(int i=1;i<=n;i++)

for(int i=1;i<=mm;i++)

int ans=0

;

for(int i=1;i<=n;i++)

} cout

<

#include#include

#include

using

namespace

std;/*3

3 1 10

1 46 10

*/const

int maxn=1e6+100

; int

lsh[maxn];

intli[maxn],ri[maxn];

intvis[maxn];

struct

nodet[maxn];

intn;

int cnt=0

;void build(int p,int l,int

r)

int mid=(t[p].l+t[p].r)/2

; build(p*2

,l,mid);

build(

2*p+1,mid+1

,r);

}void upsh(int

p)void update(int p,int l,int r,int

x)

if(t[p].lazy)

int mid=(t[p].l+t[p].r)/2

;

if(l<=mid)

if(r>mid)

} int query(int p,int

x)

if(t[p].lazy)

int mid=(t[p].l+t[p].r)/2

;

if(x<=mid)

else

}int

main()

sort(lsh+1,lsh+cnt+1

);

int mm=unique(lsh+1,lsh+cnt+1)-(lsh+1

);

int nn=mm;

for(int i=2;i<=nn;i++)

}sort(lsh+1,lsh+mm+1

); build(

1,1,mm);

for(int i=1;i<=n;i++)

for(int i=1;i<=mm;i++)

int ans=0

;

for(int i=1;i<=n;i++)

} cout}}

線段樹區間覆蓋

線段樹能支援什麼操作呢 對區間進行操作,我們肯定要使用懶標記 那麼懶標記的下放順序就是乙個問題 我們目前需要處理3個懶標記分別記為 lazy,add,mul 優先順序應該是 lazy mul add 為什麼呢,首先是因為如果區間覆蓋,那麼前面更新的區間加,區間乘都會啞然失色,所以說區間覆蓋才是巨佬,...

codevs3037 線段覆蓋5 離散化DP

codevs3037 線段覆蓋5 不懂某些人為什麼要用bit 這樣會帶壞小朋友的啊喂 雖然說刷到大師了寫個bit就是一分鐘的事 不過你強行加個log會很慢的阿喂,何況這題的log大概是20。其實我寫的也不好 並沒有1a而且錯誤還比較多 dp i 表示到離散化之後的端點i之前最大價值。然後把線段按右端...

校門外有很多樹 線段覆蓋問題

問題描述 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k 1,讀入l,r表示在l r之間種上的一種樹 k 2,讀入l,r表示詢問l r之間能見到多少種樹 1 l r n 輸入格式 ...