[YM]模板-三维前缀和模板

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";
    }
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值