高维前缀和
惊喜地发现另外一种求前缀和的方式,转来粘这,感谢这位大佬的学习笔记,
[学习笔记]高维前缀和
PS:(现在更倾向于楼上的惊喜方法)
附.三维前缀和 O(N3*23)的写法
S(X, Y, Z) = a(X, Y, Z)
+S(X, Y, Z - 1) + S(X, Y - 1, Z) + S(X - 1, Y, Z)
-S(X, Y - 1, Z - 1) - S(X - 1, Y, Z - 1) - S(X - 1, Y - 1, Z)
+S(X - 1, Y - 1, Z - 1)
便于记忆的方法:二进制001——111,奇数个(-1)则为正号。(总共2t个加数咯,算上本身嘛)
@奇数则为加
S(X, Y, Z) = a(X, Y, Z) + | 表示 |
---|---|
001 符号:+ | S(X, Y, Z - 1) |
010 符号:+ | S(X, Y - 1, Z) |
011 符号:- | S(X, Y - 1, Z - 1) |
100 符号:+ | S(X - 1, Y, Z) |
101 符号:- | S(X - 1, Y - 1, Z) |
110 符号:- | S(X - 1, Y - 1, Z) |
111 符号:+ | S(X - 1, Y - 1, Z - 1) |
三维差分8个式子
@与第一行相同的情况(奇数、偶数个1),则符号与第一行相同,此时即奇数则为负
二进制 | 表示 |
---|---|
000 | ——————————————B(X1, Y1, Z1) += C ——使该立方体全部加上常数C |
001 | B(X1, Y1, Z2 + 1) -=C |
010 | B(X1, Y2 + 1, Z1) -= C |
011 | B(X1, Y2 +1, Z2 + 1) += C |
100 | B(X2 +1, Y1, Z1) -= C |
101 | B(X2 + 1, Y1, Z2 + 1) += C |
110 | B(X2 + 1, Y2 + 1, Z1) += C |
111 | B(X2 + 1, Y2 + 1, Z2 + 1) -= C |