高维前缀和(差分)(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\)