树状数组之区间修改单点查询
樹狀數組的區間修改單點查詢
樹狀數組其實本質還單點修改區間查詢,但是我們怎么延伸到這個呢,我們建立一個差分數組,
比如:? ? ? ? ? ? ? ? a[10]={4, 6, 7, 5, 1, 6, 3, 4, 2, 7}
對應的差分數組??c[10]={4, 2,1,-2,-4, 5,-3, 1,-2, 5}
c[i]=a[i]-a[i-1]
然后c[4]=a[0]+a[1]+a[2]+a[3]
我們當前的那個c[i]變量就等于前i項a[i]和
我們就按之區間查詢單點修改的方法把這個c數組存下來
如果我們把[l,r]區間的值都加上num的話我們實際上只要把c數組的c[l]+=num,c[r+1]-=num;
這個是怎么來的呢,舉個例子 1 3 5 7 9
對應的c數組? 1? 2 2 2 2
我們把[2,3]都加個2,對應的兩個數組就變為
1? 5? 7 9 9
1 4? 2? 2? 0
因為中間都加的是一樣的數,所以只要修改兩端就行
?但是我們核心還是樹狀數組,所以我們之前包含要修改的數的區間都要修改
所以和之前的單點修改一樣了,只是區間[l,r]樹狀數組只能修改[l,n],[r+1,n]
我們就先用[l,n]都加上num,然后[r+1,n]都減個num
所以我們實現代碼就也很簡單了,就是插數的時候用add(l,num) add(r+1,-num)
找a[i]的時候就是sum(i)
轉載于:https://www.cnblogs.com/Lis-/p/9361909.html
總結
以上是生活随笔為你收集整理的树状数组之区间修改单点查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python全栈工程师(文件操作、编码)
- 下一篇: java - 方法的重载