首先当然是最基础的树状数组了,单点修改、区间查询的树状数组代码: //BIT - 单点增加,区间查询 - ststruct_BIT{intN,C[MAXN];intlowbit(intx){returnx&(-x);}voidinit(intn)//初始化共有n个点{ N=n;for(inti=1;i<=N;i++) C[i]=0; }voidadd(intpos,intval)//在pos点加上val{while(pos...
在一维树状数组中,tree[x](树状数组中的那个“数组”)记录的是右端点为x、长度为lowbit(x)的区间的区间和。 那么在二维树状数组中,可以类似地定义tree[x][y]记录的是右下角为(x, y),高为lowbit(x), 宽为 lowbit(y)的区间的区间和。 单点修改 + 区间查询 voidadd(intx,inty,intz){//将点(x, y)...
至此,我们解决了如何处理树状数组维护对象的问题。 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][...
个,保证运算过程中及最终结果均不超过 64 位带符号整数类型的表示范围,并且修改与查询的子矩阵存在。 AC代码 代码语言:javascript 复制 #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include #include <unordered...
0 #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #define endl '\n' #define int long long using namespace std; const int N = 1 << 10; int tr[N][N], tri[N][N], trj[N][N], trij[N][N]; int n, m; int Q; int lowbit...
区间修改、区间查询 二维树状数组 ①单点修改、区间查询BIT: 首先当然是最基础的树状数组了,单点修改、区间查询的树状数组代码: //BIT - 单点增加,区间查询 - st struct _BIT{ int N,C[MAXN]; int lowbit(int x){return x&(-x);} ...
树状数组 https://oi-wiki.org/ds/fenwick/ 题目描述 这是一道模板题。 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 A_{x,y} 自增 k; 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和。 输入格式 输入的第一行有两个正整数 n, m; ...
一、二维树状数组(如果不知道树状数组,请点这里) 先来看一下一维的树状数组的结构: 其实二维树状数组也差不多,只不过每一行和每一列都是一个树状数组,画出来就有些眼花缭乱了,在这里就不画出来了,先把getsum()和update()的代码写出来吧。 getsum(): ...
#135. 二维树状数组 3:区间修改,区间查询 题目描述 这是一道模板题。 给定一个大小为 N \times MN×M 的零矩阵,直到输入文件结束,你需要进行若干个操作,操作有两类: 1 a b c d x,表示将左上角为 (a,b)(a,b),右下角为 (c,d)(c,d) 的子矩阵全部加上 xx; 2 a b c d,表示询问左上角为...
树状数组 https://oi-wiki.org/ds/fenwick/ 题目描述 这是一道模板题。 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 A_{x,y} 自增 k; 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和。 输入格式 输入的第一行有两个正整数 n, m;接...