Skip to content

ABC366D Cuboid Sum Query

原题链接:D - Cuboid Sum Query

Tag:高维前缀和

题目描述

给定一个正整数 \(N\) 和满足 \(1 \leq x, y, z \leq N\) 的整数组 \((x, y, z)\),对于每个组合都有一个整数 \(A_{x, y, z}\)

现在给出 \(Q\) 个查询,每个查询要求如下:

对于第 \(i\) 个查询 \((1 \leq i \leq Q)\),给出一组整数 \((Lx_i, Rx_i, Ly_i, Ry_i, Lz_i, Rz_i)\),其中 \(1 \leq Lx_i \leq Rx_i \leq N,\ 1 \leq Ly_i \leq Ry_i \leq N, 1 \leq Lz_i \leq Rz_i \leq N\)。要求计算并输出以下求和结果:

\[ \sum_{x=Lx_i}^{Rx_i}\ \sum_{y=Ly_i}^{Ry_i}\ \sum_{z=Lz_i}^{Rz_i}\ A_{x,y,z} \]

数据说明:

  • \(1 \leq N \leq 100\)
  • \(1 \leq Q \leq 2 \times 10^{5}\)
  • \(0 \leq A_{x,y,z} \leq 999\) \((1 \leq x, y, z \leq N)\)
  • \(1 \leq Lx_i \leq Rx_i \leq N\) \((1 \leq i \leq Q)\)
  • \(1 \leq Ly_i \leq Ry_i \leq N\) \((1 \leq i \leq Q)\)
  • \(1 \leq Lz_i \leq Rz_i \leq N\) \((1 \leq i \leq Q)\)

分析

三维前缀和板子题,直接写就过了。

代码实现

int a[105][105][105],s[105][105][105];
void NeverSayNever() {
    int n;cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            for (int k = 1; k <= n; k++)cin >> a[i][j][k];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            for (int k = 1; k <= n; k++)
                s[i][j][k] =
                        s[i][j][k - 1] + s[i][j - 1][k] + s[i - 1][j][k] 
                        - s[i - 1][j - 1][k] - s[i - 1][j][k - 1] - s[i][j - 1][k - 1] 
                        + s[i - 1][j - 1][k - 1] 
                        + a[i][j][k];
        }
    }
    int q; cin >> q;
    while (q--) {
        int x,xx,y,yy,z,zz;
        cin >> x >> xx >> y >> yy >> z >> zz;
        cout << s[xx][yy][zz] 
                - s[xx][yy][z - 1] - s[xx][y - 1][zz] - s[x - 1][yy][zz] 
                + s[x - 1][y - 1][zz] + s[x - 1][yy][z - 1] + s[xx][y - 1][z - 1]
                - s[x - 1][y - 1][z - 1] << endl;
    }
}

日志

本页面创建于 2024/8/17 20:38