前缀和在点与区间上的区别:
在构造前缀和数组的时候是没有区别的, 都是
sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]
经过上面这种构造之后, 如果表示的是区间前缀和的话, 那么(i, j)
这个点表示的是 [i-1, j-1] ~ [i, j]
这个单位区间, 也就是每个单位区间用右下角的点表示
在计算某个区间的前缀和时, 有 是否-1的区别
当表示的是点前缀和时, 当要计算(x1,y1) ~ (x2,y2)
这个区间的总和时 需要-1
=> x = sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1]
而如果表示的是区间前缀和时, 就不需要-1
=> x = sum[x2][y2] - sum[x1][y2] - sum[x2][y1] + sum[x1][y1]
离散化:
只是为了将数值映射到更小的范围 => 用unordered_map, 给每一个数分配一个唯一的id, 然后用这个id表示该数即可
如果需要处理离散化之后元素之间的关系 => 用vector存储所有的数(可以进行排序) 原理同样是给每一个数分配唯一的id(下标)