簡單差分(這個其實真的容易理解)
阿新 • • 發佈:2018-04-06
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).
這個代碼應該不難,所以我也就不貼了(其實這算一種思想,沒有完全的板子)
簡單差分(這個其實真的容易理解)