#sZSZybttg040106. 1540:打鼹鼠_二维树状数组

1540:打鼹鼠_二维树状数组

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

这是一道模板题。

给出一个 n×mn \times m 的零矩阵 AA,你需要完成如下操作:

  1. 1 x y k:表示元素 Ax,yA_{x,y} 自增 kk(即 Ax,yAx,y+kA_{x,y} \gets A_{x,y} + k);
  2. 2 a b c d:表示询问左上角为 (a,b)(a,b),右下角为 (c,d)(c,d) 的子矩阵内所有数的和(即 i=acj=bdAi,j\sum_{i=a}^{c} \sum_{j=b}^{d} A_{i,j})。

输入格式

第一行有两个正整数 n,mn, m,表示矩阵的行数和列数。

接下来若干行,每行一个操作,直到文件结束(EOF)。

操作格式:

  • 1 x y k
  • 2 a b c d

输出格式

对于每个操作 2,输出一行一个整数,表示该子矩阵的元素和。


样例

样例输入

2 2
1 1 1 3
1 2 2 4
2 1 1 2 2

样例输出

7

样例说明

初始矩阵:

[0000]\begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix}

操作1:1 1 1 3A1,1=3A_{1,1} = 3
矩阵变为:

[3000]\begin{bmatrix} 3 & 0 \\ 0 & 0 \end{bmatrix}

操作2:1 2 2 4A2,2=4A_{2,2} = 4
矩阵变为:

[3004]\begin{bmatrix} 3 & 0 \\ 0 & 4 \end{bmatrix}

操作3:2 1 1 2 2 → 询问左上角 (1,1)(1,1) 到右下角 (2,2)(2,2) 的子矩阵和 =3+0+0+4=7= 3+0+0+4 = 7


数据范围

  • 对于 10%10\% 的数据,n=1n=1(一维情况);
  • 对于另 10%10\% 的数据,m=1m=1(一维情况);
  • 对于全部数据:
    • 1n,m212=40961 \le n, m \le 2^{12} = 4096
    • 1x,a,cn1 \le x, a, c \le n
    • 1y,b,dm1 \le y, b, d \le m
    • k105|k| \le 10^5
    • 操作数目不超过 3×1053\times 10^5
    • 保证询问的子矩阵存在(即 ac,bda \le c, b \le d

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}(512 MB)

提示
此题为 二维树状数组 的模板题。

二维树状数组

  • 支持单点更新(Ax,yAx,y+kA_{x,y} \gets A_{x,y} + k);
  • 支持二维前缀和查询(i=1xj=1yAi,j\sum_{i=1}^{x} \sum_{j=1}^{y} A_{i,j});
  • 通过二维前缀和差分可以得到任意子矩阵和。

子矩阵和公式: 设 sum(x,y)=i=1xj=1yAi,jsum(x,y) = \sum_{i=1}^{x} \sum_{j=1}^{y} A_{i,j},则:

$$\sum_{i=a}^{c} \sum_{j=b}^{d} A_{i,j} = sum(c,d) - sum(a-1,d) - sum(c,b-1) + sum(a-1,b-1)$$

二维树状数组操作

  • 单点更新 add(x, y, k):对所有 ix,jyi \ge x, j \ge ytree[i][j]tree[i][j]kk
  • 前缀和查询 sum(x, y):返回 i=1xj=1yAi,j\sum_{i=1}^{x} \sum_{j=1}^{y} A_{i,j}

复杂度

  • 单点更新:O(lognlogm)O(\log n \cdot \log m)
  • 子矩阵查询:O(lognlogm)O(\log n \cdot \log m)

注意

  • 由于 n,m4096n,m \le 4096,二维数组 tree[4097][4097] 占用内存约 $4097\times 4097 \times 4\text{ bytes} \approx 67\text{ MB}$,加上其他变量在 512 MB 内存内可行;
  • 输入直到 EOF,注意判断读入结束;
  • kk 可能为负数,使用 intlong long 存储(前缀和可能超出 int 范围,建议用 long long)。