2 2 1 1 1 3 1 2 2 4 2 1 1 2 2 输出复制 代码语言:javascript 复制 7 数据范围与提示 对于10% 的数据,n=1; 对于另 10% 的数据,m=1; 对于全部数据,1≤n,m≤212,1≤x,a,c≤n,1≤y,b,d≤m,|k|≤105 ,保证操作数目不超过 3×105 ,且询问的子矩阵存在。 AC代码 代码语言:javascr...
lowbit(x) 表示二进制下x的最低位的1与它后面的0构成的树,那么对于奇数来说就是1 假设6x6的数组,更新(2,3)也就是更新标绿的表格 求sum(5, 3)的值就是求标蓝表格的和 代码 #include<cstdio>#include<cstring>intn, m;longlongarr[5005][5005];intlowbit[5005];voidupdate(intx,inty,intz){while(x...
printf("%lld\n",query(c, d) -query(a -1, d) -query(c, b -1) +query(a -1, b -1)); elsea =Read(), b =Read(), c =Read(),modify(a, b, c); } return0; } 单点修改区间查询 LOJ #135. 二维树状数组 3:区间修改,区间查询 一般区间修改的树状数组维护的都是差分数组,那么二...
单点加,区间查询 LOJ #133. 二维树状数组 1:单点修改,区间查询 给出一个 n \times m 的零矩阵 A ,你需要完成如下操作: 1 \, x \, y \, k :表示元素 A_{x,y} 自增k; 2 \, a \, b \, c \, d :表示询问左上角为 (a,b) ,右下角为 (c,d) 的子矩阵内所有数的和。 在上面的...
//修改区间,查询点 #include<iostream> #include<cstring> using namespace std; const int maxn=100005; const int maxq=100005; int a[maxn];int b[maxn];int c[maxn]; //a原数组,b是a的差分数组,c是b的树状数组 int lowbit(int x){ ...
二维树状数组也是一样的,建立二维数组,将数组部分元素用区间和代替,实现log查询sum。 位置p对p+lowbit(p)…有贡献,所以每次添加把所有(x,y)对应的位置增加(对其都有贡献)。 eg:a数组内容全是1,其seg如下图。 区间修改,单点查询https://loj.ac/p/134 ...
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] =\...
区间修改单点查询(与差分结合): struct tree{ #define lowbit(wh) (wh&-wh) int c[N],m; void change1(int wh,int num){ for(;wh<=m;wh+=lowbit(wh))c[wh]+=num; } void change2(int l,int r,int num){ change1(l,num);
暴力大法好,但是会超时,所以这道题需要用树状数组来写,依照别的博客的例子来写,首先我们要先看一维数组的性质,对于l到r的值取反,我们的操作就是pre[l]++,pre[r+1]++,因为这道题只有0和1,所以树状数组维护的是被修改的次数,所以查询的操作就是就是前i个的和mod2,千万不要把这个当成数组理解,因为是树状数...