高维前缀和

高维前缀和

高维前缀和,就是对每一个高维空间的点 (a1,a2,,ak) ,求 b1=0a1b2=0a2bk=0akval(b)

一种做法是容斥,在此不详讲,复杂度 O(nk2k)

以二维为例:

for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
        sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];

另一种做法是降维。

考虑 fi(a)=b1=0a1b2=0a2bi=0aival(b1,b2,,bi,ai+1,,ak)

f0(a)=val(a),fk(a)=ans
考虑 fi1fi

fi(a)=bi=0aifi1(a1,a2,,ai1,bi,ai+1,,ak)

复杂度 O(nkk)

仍以二维为例:

for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
        sum[i][j]+=sum[i][j-1]+a[i][j];
for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
        sum[i][j]+=sum[i-1][j];

高维前缀差分

高维前缀和的逆运算,即已知 fk(a),求 a

同样,只需考虑 fi1fi

fi(a)=bi=0aifi1(a1,a2,,ai1,bi,ai+1,,ak)fi1(a)=fi(a1,a2,,ak)fi(a1,a2,,ai1,ai1,,ak)

SOSDP

即求子集权值和。考虑到这等价于一个高维前缀和问题。

直接给出代码:

// f[s] 初始值为 val[s]
for(int i=0;i<k;++i)
    for(int s=0;s<(1<<k);++s)
        if(s&(1<<i)) f[s]+=f[s^(1<<i)]
posted @   pref_ctrl27  阅读(149)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示