高维前缀和(差分)(sosdp)

高维前缀和

  • 二维前缀和:\(s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1]\)
  • 三位前缀和:\(s[i][j][k]=s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]-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]\)
    \(\dots\)
    设空间的维度为 \(k\),则:
  • 时间复杂度:\(O(|高维空间容量|\times 2^k)\)
    另外一种求解方式:
  • 二维:
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]+=a[i-1][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]+=a[i][j-1];
  • 三维:
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i-1][j][k];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i][j-1][k];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i][j][k-1];

\(\dots\)

  • 时间复杂度:\(O(|高维空间容量|\times k)\)

高维差分

  • 二维差分
    在子矩阵(\((x_1,y_1)\)\((x_2,y_2)\) 分别为子矩阵左上角和右下角下标)中加上一个数 \(k\),先差分:\(s[x_1][y+1]+=k,s[x_2+1][y_1]-=k,s[x_1][y_2+1]-=k,s[x_2+1][y_2+1]+=k\),再取前缀和
  • 三维差分
二进制表示
000 \(s[x_1][y_1][z_1]+=k\)
001 \(s[x_1][y_1][z_2+1]-=k\)
010 \(s[x_1][y_2+1][z_1]-=k\)
011 \(s[x_1][y_2+1][z_2+1]+=k\)
100 \(s[x_2+1][y_1][z_1]-=k\)
101 \(s[x_2+1][y_1][z_2+1]+=k\)
110 \(s[x_2+1][y_2+1][z_1]+=k\)
111 \(s[x_2+1][y_2+1][z_2+1]-=k\)

\(\dots\)

posted @ 2021-11-14 20:45  zyy2001  阅读(156)  评论(0编辑  收藏  举报