前置知识:一维树状数组+多维前缀和
一维树状数组:
- 普通版,O(log)区间查询,O(log)单点更新
- 差分版,O(log)单点查询,O(log)区间更新
- 维护多个差分数组,O(log)区间查询,O(log)区间更新
树状数组求第k小,即用普通版树状数组统计数字出现次数
1 |
|
而二维树状数组,用两层嵌套的for
1 | void add(int x,int y,int val) |
很好理解,每个x值对应一个一维树状数组,故先对每个x值所对应的一维数组进行更新、查询,再进行整合
时间复杂度为:单点更新,区间查询,区间查询还用到了容斥定理
差分版:
由二维前缀和可知:
a[i][j]=sum[i][j]-sum[i-1][j]-sum[i][j-1]+sum[i-1][j-1]
故用d[i][j]表示a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
当求a[i][j]时,套用区间查询即可
1 | void add(int x,int y,int val) |
区间修改、区间查询同一维数组类似,维护多个差分数组,推式子即可