給定乙個 $n \times m$ 的矩陣,有 $t$ 次詢問,每次會給出四個數 $a,b,c,d$,求以點 $(a,b)$ 為左上角,點 $(c,d)$ 為右下角的矩形所有元素和。
$1 \le n,m \le 3000$,$1 \le t \le 10^6$。
我們先把問題變簡單:如何用二維字首和求出整個矩陣的和?
觀察一維遞推式:$s_i=s_+a_i$。
那麼二維遞推式大概長這樣 $s_=f+a_$,$f$ 為由前面遞推出的數字。
先假設 $f=s_+s_$,但是很容易推翻這個假設,因為從 $(1,1)$ 到 $(i-1,j-1)$ 之間矩陣的所有數被算了兩次。
所以按照容斥原理,累加值應該減去乙份 $s_$。
所以 $s_=s_+s_-s_+a_$,而整個矩陣的和就是 $s_$。
然後是第二個問題:怎麼 $o(1)$ 查詢任意乙個子矩陣的元素和?
首先,$(1,1)$ 到 $(c,d)$ 的元素和為 $s_$。
和之前一樣,我們需要減去多餘的部分,也就是 $s_$ 和 $s_$。
而且要把減多的還回來,加上 $s_$。
也就是:$\texttt=s_-s_-s_+s_$。
字首和與差分
數列的字首和 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...
字首和與差分
例題入口 include const int n 320 int a n n a i 1 a i 0 1.對a 求出平方數 將其值置為1 不是平方數就是0 2.對a求乙個字首和 3.對 a,b 求乙個部分和 int sum n n void init for int i 1 i 100000 i i...