Atcoder366:
D - Cuboid Sum Query (atcoder.jp)
鉴于atcoder考到了三维前缀和的知识点,但是网上又没有简洁的模板,so唯唯诺诺发个板子
先给出三维前缀和的公式:
pre[x][y][z]=a[x][y][z]+pre[x-1][y][z]+pre[x][y-1][z]+pre[x][y][z-1]
-pre[x-1][y-1][z]-pre[x-1][y][z-1]-pre[x][y-1][z-1]+pre[x-1][y-1][z-1]
pre=当前值+x前面的前缀和+y前面的前缀和+z前面的前缀和-重复的部分
模板:
const int M = 105;
int n,q;
ll a[M][M][M],pre[M][M][M];
void init(int n){
for(int x=1;x<=n;x++)
for(int y=1;y<=n;y++)
for(int z=1;z<=n;z++){
cin>>a[x][y][z];
pre[x][y][z]=a[x][y][z]+pre[x-1][y][z]+pre[x][y-1][z]+pre[x][y][z-1]
-pre[x-1][y-1][z]-pre[x-1][y][z-1]-pre[x][y-1][z-1]+pre[x-1][y-1][z-1];
}
}
ll query(int Lx,int Rx,int Ly,int Ry,int Lz,int Rz){
return pre[Rx][Ry][Rz]-pre[Lx-1][Ry][Rz]-pre[Rx][Ly-1][Rz]-pre[Rx][Ry][Lz-1]
+pre[Lx-1][Ly-1][Rz]+pre[Lx-1][Ry][Lz-1]+pre[Rx][Ly-1][Lz-1]-pre[Lx-1][Ly-1][Lz-1];
}
void solve(){
cin>>n;
init(n);
cin>>q;
while(q--){
int Lx,Rx,Ly,Ry,Lz,Rz;
cin>>Lx>>Rx>>Ly>>Ry>>Lz>>Rz;
cout<<query(Lx,Rx,Ly,Ry,Lz,Rz)<<"\n";
}
}