我在互联网上搜索但找不到好的。 我从geeksforgeeks.org那里得到了一些帮助,但是在更新BIT数组时,我们无法理解我们从aux [i] [j]中减去v1-v2-v2-v4 + v3的构造部分。只是让我知道为什么我们在这里减去。
void constructAux(int mat[][N], int aux[][N+1])
{
// Initialise Auxiliary array to 0
for (int i=0; i<=N; i++)
for (int j=0; j<=N; j++)
aux[i][j] = 0;
// Construct the Auxiliary Matrix
for (int j=1; j<=N; j++)
for (int i=1; i<=N; i++)
aux[i][j] = mat[N-j][i-1];
return;
}
// A function to construct a 2D BIT
void construct2DBIT(int mat[][N], int BIT[][N+1])
{
// Create an auxiliary matrix
int aux[N+1][N+1];
constructAux(mat, aux);
// Initialise the BIT to 0
for (int i=1; i<=N; i++)
for (int j=1; j<=N; j++)
BIT[i][j] = 0;
for (int j=1; j<=N; j++)
{
for (int i=1; i<=N; i++)
{
// Creating a 2D-BIT using update function
// everytime we/ encounter a value in the
// input 2D-array
int v1 = getSum(BIT, i, j);
int v2 = getSum(BIT, i, j-1);
int v3 = getSum(BIT, i-1, j-1);
int v4 = getSum(BIT, i-1, j);
// Assigning a value to a particular element
// of 2D BIT
updateBIT(BIT, i, j, aux[i][j]-(v1-v2-v4+v3));
}
}
return;
}
答案 0 :(得分:0)
对topcoder上的2d二进制索引树有一个很好的解释。
要理解aux[i][j]-(v1-v2-v4+v3)
注意:
getSum(BIT,i,j)
返回矩形中所有元素的总和,其中左上角位于原点,右下角位于坐标i,j。getSum(BIT, i, j)-getSum(BIT, i, j-1)
是第j行到列i的所有元素的总和getSum(BIT, i-1, j)-getSum(BIT, i-1, j-1)
是第j行到列i-1 v1-v2-v4+v3
是位置i,j 更新代码的工作原理是在某个位置添加值。在此代码中,他们希望将值设置为aux[i][j]
中的特定选项,因此,这样做的方法是添加目标值和当前值之间的差异。
(话虽如此,此代码依次更新每个值,因此您应该发现v1-v2-v4 + v3始终等于零,因为每个值都开始清除)