1. 程式人生 > >簡單差分(這個其實真的容易理解)

簡單差分(這個其實真的容易理解)

pan 常數 問題 spa 既然 簡單 原因 through 題目

首先,給出一個問題:

給出n個數,再給出Q個詢問,每個詢問給出le,ri,x,要求你在le到ri上每一個值都加上x,而只給你O(n)的時間範圍,怎麽辦?

1.如果暴力,卡一下le和ri,隨隨便便讓你T成狗.

2.用線段樹或樹狀數組搞一搞,抱歉,這個復雜度是O(Qlogn)的,還是會T(雖然他們解決別的題目很NB)

3.差分,沒錯,要入正題了,很高興O(n)+常數

還是用上面這個題目,假如要在le和ri上全都加一個x,很顯然,這個O(n)是不可避免的,既然這樣,那我們考慮把O(n*Q)變成O(n+Q).也就是說,在詢問中我們不去for來加x,而是做一個標記,最後一起加上

! 現在需要自己動筆模擬一下了 !

1.先另外開一個專門差分的數組(大小=題中的序列長度)

2.假如在3~8的區間上加上5,那我們在差分數組中的3位置上加上一個5(原因暫時不懂沒關系,用筆先跟著模擬),再在8+1的位置上減一個5,如此操作完Q次.

3.假如我們只有這一次操作,開始統計答案,運用前置和的思想,cf[i](差分)=cf[i-1]+cf[i].那麽你會發現(如果你模擬了的話),在3~8的區間上,你已經使差分數組全部加上了5(推廣到所有Q一起統計答案依舊正確)

4.再用O(n)的for把他們加到原序列之中去,輸出!

看一下復雜度,果然:O(常數*n).

這個代碼應該不難,所以我也就不貼了(其實這算一種思想,沒有完全的板子)

簡單差分(這個其實真的容易理解)