(int x1, int y1, int x2, int y2) { return cnt(x2, y2) - cnt(x2, y1 - 1) - cnt(x1 - 1, y2) + cnt(x1 - 1, y1 - 1); } }; void best_coder() { int n, m; scanf("%d%d", &n, &m); FenwickTree ft(n, m); int a; while (~scanf("%d", &a)) { if (...
voidadd(intp,intx){//这个函数用来在树状数组中直接修改while(p <= n) sum[p] += x, p += p & -p; }voidrange_add(intl,intr,intx){//给区间[l, r]加上xadd(l, x), add(r +1, -x); }intask(intp){//单点查询intres =0;while(p) res += sum[p], p -= p & -p;returnre...
我们要单点查询a[pos]a[pos],由上可知a[pos]=d[1]+d[2]+⋯+d[pos]a[pos]=d[1]+d[2]+⋯+d[pos], 那么原来的sum(pos)函数不用修改,就正好能返回a[pos]a[pos]的值。 代码: //BIT - 区间修改,单点查询 - ststruct_BIT{intN,C[MAXN];intlowbit(intx){returnx&(-x);}voidinit(i...
区间修改、区间查询 二维树状数组 ①单点修改、区间查询BIT: 首先当然是最基础的树状数组了,单点修改、区间查询的树状数组代码: //BIT - 单点增加,区间查询 - st struct _BIT{ int N,C[MAXN]; int lowbit(int x){return x&(-x);} void init(int n) //初始化共有n个点 { N=n;...
LOJ #133. 二维树状数组 1:单点修改,区间查询 给出一个 n \times m 的零矩阵 A ,你需要完成如下操作: 1 \, x \, y \, k :表示元素 A_{x,y} 自增k; 2 \, a \, b \, c \, d :表示询问左上角为 (a,b) ,右下角为 (c,d) 的子矩阵内所有数的和。 在上面的单点操作我们已经提...
2.二维区间修改 根据差分的性质,我们在 (a,b),(a,d+1),(c+1,b),(c+1,d+1) 四个点分别执行 (+delta,-delta,-delta,+delta) 操作即可。 3.二维区间查询 前面已经指出,对于点 (a,b) 到(c,d) 之间的区间和,存在 tot=sum[c][d]-sum[c][b-1]-sum[a-1][d]-sum[a-1][b-1] =\...
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 二、单点修改,区间查询 LOJ #133. 二维树状数组 1:单点修改,区间查询 给出一个 \(n × m\) 的零矩阵 \(A\) \(1\) \(x\) \(y\) \(k\) :表示元素 \(A\)_{\(x\) , \(...
(int x1, int y1, int x2, int y2) { return cnt(x2, y2) - cnt(x2, y1 - 1) - cnt(x1 - 1, y2) + cnt(x1 - 1, y1 - 1); } }; void best_coder() { int n, m; scanf("%d%d", &n, &m); FenwickTree ft(n, m); int a; while(~scanf("%d", &a)) { if (a...
2.单点修改,区间查询 回想一下一维的树状数组是怎么搞的:我们维护序列的前缀和;查询区间的时候直接让前缀和相减就好。放到二维也是同理。给出区间查询的式子: ans=sum(x2,y2)−sum(x1−1,y2)−sum(x2,y1−1)+sum(x1−1,y1−1)ans=sum(x2,y2)−sum(x1−1,y2)−sum(x2,y1−1...
1首先从一维的开始,考虑最基础的单点修改,区间查询。树状数组模板1:这个是最基础的,就是定义的应用。 2再考虑区间修改,单点查询。树状数组模板2。 我们可以想到,在对一段区间[l,r][l,r]进行修改时,可以将[1,r][1,r]加上kk,将[1,l−1][1,l−1]减去kk。但这样修改,对于单点查询来说,似乎不是...