1. 程式人生 > >前綴和與差分

前綴和與差分

矩陣 復雜 求和 只需要 必須 https 起點 ref href

前綴和與差分比較常用,也算是必須掌握的方法。主要用於對區間數據的查詢處理。

在一維當中,前綴和就是指從某個元素開始一直到首個元素的和,差分是指每個元素與前一元素的差(首個元素即為本身)。

在二維裏面,設一個N*M的矩陣,起點(左上角)為(1,1),終點右下角為(N,M)。則(i,j)的前綴和為以(1,1)為起點,以(i,j)為終點的矩形內所有元素的和;(i,j)的差分則是(i,j)-(i,j-1)-(i-1,j)+(i-1,j-1)。

比較有意思的是前綴和的差分和差分的前綴和即為各個元素。

前綴和主要用於區間求和,初始化復雜度為O(n),每次查詢僅為O(1)。差分主要用於區間增加和單點查詢,區間增加復雜度僅為O(1),單點查詢相當於求差分數組的前綴和,復雜度為O(n)。區間增加,對於一維來說,要給[i,j]這個區間的每個元素加x,只需要令pre[i]+=x,pre[j+1]-=x即可(pre就是差分數組)。對於二維來說,要將(i,j,k,l)這個矩形內的每個元素都加x,則令pre[i,j]+=x,pre[i-1,l]-=x,pre[k,j-1]-=x,pre[k,l]+=x。

前綴和與差分一般並不單獨考察,而是作為一種數據處理方式與其他知識點一起考察。

比如NOIP2012 借教室:https://www.luogu.org/problemnew/show/P1083

前綴和與差分