矩阵修改矩阵求和的裸题
参考 wyl8899《树状数组维护区间和的模型及其拓广的简单总结》一文。
树状数组在进行区间操作的时候维护一个查分数组 d 。 d[i] = a[i] - a[i - 1]。 这样单点询问就是 ∑i = 1 … x d[i]
区间询问的时候, 询问 1 … x 的区间即要求 ∑i = 1 … x (d[i] * (x - i + 1)), 即 (x + 1) * ∑(d[i]) - ∑ (d[i] * i)。 所以说只要多维护一个 d[i] * i 的树状数组就可以了。
很容易拓展到二维:矩阵修改的时候, 类似地, 开一个 d[i, j] 表示 从(i, j)到 (n, m) 的这个矩阵的增量, 修改(x1, y1 , x2, y2)这个矩形即令 d[x1][y1] += c; d[x1][y2 + 1] -= c; d[x2 - 1][y1] -= c; d[x2 + 1][y2 + 1] += c; 就可以了。
询问(1,1 , x, y)的时候, 也可以求出一个式子 ∑(i=1…x, j=1…y)d[i][j] * (x - i + 1) * (y - j + 1)。 整理得 (x + 1) * (y + 1) * ∑(d[i][j]) - ∑(d[i][j] * i) * (y + 1) - ∑(d[i][j] * j) * (x + 1) + ∑(d[i][j] * i * j) 。 把这四个数全都维护起来就好了 ^_^
时间: 2024-10-22 14:20:24