高維字首和(差分)(sosdp)
阿新 • • 發佈:2021-11-14
高維字首和(差分)(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\)