暖 墟 差分 字首和與差分

2021-08-21 12:19:07 字數 1450 閱讀 2570

即:用sum[i]表示a[1]~a[i]的和。

用處1:求i~j的和 sum[j]-sum[i-1]【連續欄位和】。

用處2:區間修改。設定change陣列。當區間[i,j]上要加k時,我們令change[i]+=k,令change[j+1]-=k。

如果我們對change陣列求字首和的話,字首和sum_change[i]就是i這個位置變動的值。

1.根路徑字首和sum2[i],指i 到根節點的所有節點的權值之和。

2.子樹字首和sum1[i],指i 的子樹(包括i本身)所有節點的權值之和。

樹的字首和用處:

1.根路徑字首和,可以用來求路徑節點權值和(配合lca) 

假如要求x到y路徑的權值和,x,y的lca是z。則可以用sum[x]+sum[y]-2sum[z]+value[z]

2.子樹字首和,可以用來做路徑修改(也得配合lca) 設定修改陣列change。

如果要對x到y路徑上的所有點權值+k,lca為z。

那麼change[x]+=k,change[y]+=k,change[z]-=k,change[fa[z]]-=k。

這樣如果最後對change[i]求字首和的話,最後得到的結果就是i權值的修改量

特點:可以o(1)修改,但是只能一次查詢(因為要求字首和o(n))

q : 字首和的使用不都是用來差分的?

ans=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]

二維陣列的修改:用陣列c存修改資訊。

在c[x1][y1]處加上a,在c[x2+1][y1]和c[x1][y2+1]處減a,在c[x2+1][y2+1]再加上a。

最後(i,k)位置上變化的數值就是c陣列在(i,k)位置的字首和。 

①利用dfs序的時間戳,乙個點拆成兩個點,每次在in+1,在out-1,然後bit統計字首和,

資瓷動態修改和查詢子樹訪問次數。用於子樹打標記。

②對於點x,y設r=lca(x,y)。在x+1,y+1,r-2,然後從所有葉節點往上累加。

用於樹鏈打標記,資瓷查詢某條邊的訪問次數。 

③對於點x,y設r=lca(x,y)。在x+1,y+1,r-1,father[r]-1,然後從所有葉節點往上累加。

用於樹鏈打標記,資瓷查詢某個點的訪問次數。

字首和 差分與樹上差分

1.1 字首和 字首和可以通過對乙個序列進行o n 的預處理後,在o 1 時間內求出任意乙個子串行的和。1.2 差分 可以用於求解多次區間修改與區間詢問的題型,例如多次次給 l r 內所有數 val,就可以用差分以及字首和來優化。區間操作o 1 區間詢問o n 處理,o 1 查詢。1.3 樹上差分 ...

字首和與差分

數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...

字首和與差分

從陣列第乙個開始累加 s i s i 1 a i 求區間 l,r 的和,o 1 複雜度sum s r s l 1 遞推s i j s i j s i 1 j s i j 1 s i 1 j 1 例題 雷射炸彈一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 1000...