二维树状数组

二维树状数组可以实现在平面上的区域加、区域查询等操作。

区域修改

我们在一维时维护树状数组的区间操作时,对其进行了差分。类比一维的思想,我们在二维平面上也对树状数组差分。

我们来看二维的前缀和:

\[sum(i,j)=sum(i-1,j)+sum(i,j-1)-sum(i-1,j-1)+a(i,j) \]

可以使二维差分数组为这样的形式:

\[d(i,j)=a(i,j)-d(i-1,j)-d(i,j-1)+d(i-1,j-1) \]

(发现了吧,这其实就是)

比如我们有一下这个全为 \(0\) 的矩阵,那么给中间 \(2\times 3\) 的矩阵差分后长成这样:(“o” 表示操作区域)

0 0 0 0 0    0 0 0 0 0
0 o o o 0 -> 0 +x 0 0 -x
0 o o o 0    0 0 0 0 0
0 0 0 0 0    0 -x 0 0 +x

这样我们就简单地完成了区域加的操作。

区域查询

根据差分数组的定义,我们不难发现,对于点 \((x,y)\) ,它的二维前缀和就是:

\[\sum_{i=1}^x\sum_{j=1}^y\sum_{h=1}^i\sum_{k=1}^j d[h][k] \]

但我们类比一下一维树状数组的区间求和,我们亦可以统计每个 \(d[h][k]\) 出现的次数,我们就可以发现 \(d[1][1]\) 出现了 \((x\times y)\) 次,\(d[1][2]\) 出现了 \(x\times(y-1)\) 次……\(d[h][k]\) 出现了 \((x-h+1)\times (y-k+1)\) 次。

则原式整理得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times (x-i+1)\times (y-j+1) \]

分解得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times [(xy-xj+x)+(-yi+ij-i)+(y-j+1)] \]

最后得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times (xy+x+y+1)-d[i][j]\times i(y+1)-d[i][j]\times j(x+1)+d[i][j]\times i\times j \]

根据我们最后分解出来的公式,我们需要维护四个数组 \(d[i][j],d[i][j]\times i,d[i][j]\times j,d[i][j]\times i\times j\) ,从而实现区间查询。

例题 — P4514 上帝造题的七分钟

即二维树状数组裸题。

$\texttt{code}$
#define Maxn 2050
int n,m,tree[Maxn][Maxn][4];
inline void add(int x,int y,int k)
{int a=k,b=k*x,c=k*y,d=k*x*y;for(int i=x;i<=n;i+=i&(-i))for(int j=y;j<=m;j+=j&(-j)){tree[i][j][0]+=a;tree[i][j][1]+=b;tree[i][j][2]+=c;tree[i][j][3]+=d;}
}
inline int query(int x,int y)
{int ret=0,a=x*y+x+y+1,b=y+1,c=x+1,d=1;for(int i=x;i;i-=i&(-i))for(int j=y;j;j-=j&(-j)){ret+=tree[i][j][0]*a;ret-=tree[i][j][1]*b;ret-=tree[i][j][2]*c;ret+=tree[i][j][3]*d;}return ret;
}if(修改) add(a,b,x),add(a,d+1,-x),add(c+1,b,-x),add(c+1,d+1,x);
else printf("%d\n",query(c,d)-query(a-1,d)-query(c,b-1)+query(a-1,b-1));

参考文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AcWing 249. 蒲公英】

【AcWing 249. 蒲公英】 题意&#xff1a; 长度为n的序列&#xff0c;给定区间&#xff0c;求区间众数&#xff0c;如果出现次数相同&#xff0c;输出编号最小的 题解&#xff1a; 区间众数&#xff0c;不带修改&#xff0c;强制在线&#xff08;否则可以莫队&#xff09; …

年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇

2018年就结束了&#xff0c;马上就要迎来2019年&#xff0c;这一年很不平凡&#xff0c;中美贸易战还在继续&#xff0c;IT互联网发生急剧变化&#xff0c;大量互联网公司开始裁员&#xff0c;微软的市值在不断上升 &#xff0c;在互联网公司的市值下跌过程中爬到了第一的位置&…

等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

文章目录T1&#xff1a;等比数列三角形题目题解代码实现T2&#xff1a;电报题目题解代码实现T1&#xff1a;等比数列三角形 题目 求三边都是 ≤n 的整数&#xff0c;且成等比数列的三角形个数 注意三角形面积不能为 0 注意 oeis 中未收录此数列&#xff0c;所以并不需要去搜了…

模板:笛卡尔树

介绍 笛卡尔树是一种非常特殊的二叉搜索树。每个节点有两个信息x和y。如果只考虑 x&#xff0c;它是一棵二叉搜索树&#xff0c;如果只考虑 y&#xff0c;它是一个小根堆。 实现 按照y升序插入 显然应该插入到一条极右链上 但为了维护x二叉搜索树的性质 对于右链上x>当前…

乱搞

占个坑&#xff0c;找时间补

【AcWing 243. 一个简单的整数问题2】

例题&#xff1a;【AcWing 243. 一个简单的整数问题2】 线段树模板题&#xff0c;区间修改区间求和。 题解&#xff1a; 将序列分成N/B块&#xff0c;维护&#xff1a; id[i] i/B&#xff0c;i所在块标号 res[id] 第id块的sum base[id] 第id块的add标记修改时&#xff0…

CF1540B-Tree Array【数学期望,dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1540B 题目大意 nnn个点的一棵树&#xff0c;开始随机选择一个点标记&#xff0c;然后每次随机选择一个与被标记点连边的点标记&#xff0c;按照标记顺序排列&#xff0c;求期望逆序对数。 1≤n≤2001\leq n\leq 2001≤n≤2…

使用PerfView监测.NET程序性能(三):分组

在上一篇博客使用PerfView监测.NET程序性能&#xff08;二&#xff09;&#xff1a;Perfview的使用中&#xff0c;我们通过Perfview帮助文件中自带的代码来简单使用了Perfview&#xff0c;了解了基本操作。现在来看看Perfview中的分组操作&#xff08;Grouping&#xff09;。分…

【做题记录】构造题

CF468C Hack it! 题意&#xff1a; 令 \(F(x)\) 表示 \(x\) 的各个位上的数字之和&#xff0c;如 \(F(1234)123410\) 。 给定 \(a(a\le 10^{18})\) &#xff0c;请求出任意一组 \(l,r(l,r\le 10^{200})\) &#xff0c;要求满足&#xff1a; \[\sum_{il}^{r}F(i)\pmod{a}0 \]输出…

主席树 学习报告

文章目录前言可持久化线段树代码区间第k大代码练习粟粟的书架代码森林代码任务查询系统代码列队代码前言 主席树&#xff0c;全称是可持久化权值线段树 利用r和l-1两棵权值线段树作差得到[l,r]的信息 从而解决各种问题 在排名这方面功能极其强大 可持久化线段树 学主席树之前…

Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

文章目录T1&#xff1a;Star Way To Heaven题目题解代码实现T2&#xff1a;飞扬的小鸟题目题解代码实现T1&#xff1a;Star Way To Heaven 题目 小 w 伤心的走上了 Star way to heaven。 到天堂的道路是一个笛卡尔坐标系上一个 n*m 的长方形通道 顶点在 (0,0) 和 (n,m) 。 小…

CF1043E Train Hard, Win Easy

CF1043E Train Hard, Win Easy 题意&#xff1a; n个人有Ai和Bi两个属性&#xff0c;给出m个关系&#xff1a;xi yi表示xi和yi不能配对 i,j两人规定匹配的价值为min (Ai Bj , Bi Aj ) 回答出每个人跟所有人配对&#xff08;除开不能和自己匹配的人&#xff09;的价值总和 …

P7887-「MCOI-06」Existence of Truth【构造】

正题 题目连接:https://www.luogu.com.cn/problem/P7887?contestId52021 题目大意 给出三个长度为nnn的序列xi,yi,zix_i,y_i,z_ixi​,yi​,zi​&#xff0c;求一个序列aaa满足0≤ai<10970\leq a_i<10^970≤ai​<1097且 xi(∑j1iaj)yi(∑jinaj)≡zi(mod1097)x_i\lef…

IdentityServer4-客户端的授权模式原理分析(三)

在学习其他应用场景前&#xff0c;需要了解几个客户端的授权模式。首先了解下本节使用的几个名词Resource Owner&#xff1a;资源拥有者&#xff0c;文中称“user”&#xff1b;Client为第三方客户端&#xff1b;Authorization server为授权服务器&#xff1b;redirection URI&…

【做题记录】[NOIP2011 提高组] 观光公交

P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速。 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小。 如果当前到达某个点时已经有人在等待了&#xff0c;那么加速这个点以前的边能够让这个点下车的人距离减少…

[2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

文章目录T1&#xff1a;复读数组题目题解代码实现T2&#xff1a;路径计数机题目题解代码实现T3&#xff1a;排列计数机题目题解CODET1&#xff1a;复读数组 题目 有一个长为nk的数组&#xff0c;它是由长为n的数组A1,A2,…,An重复k次得到的。 定义这个数组的一个区间的权值为…

模板:(多重)哈希

前言 还在为不想写双哈希又怕哈希冲突挂掉发愁吗&#xff1f; 来这里&#xff0c;满足你的一切梦想&#xff01; 哈希还有模板&#xff1f; 其实就是把相关的函数和数组打包到一个结构体里 但是针心方便啊&#xff01;&#xff01;&#xff01; 如果想双哈希的话&#xff0c;定…

CF1183H Subsequences (hard version)

题意&#xff1a; 长度为n的字符串S&#xff0c;现在要找出k个不同的子序列&#xff0c;使得这些序列的总价值最低 一个序列的价值等于删去的字符长度&#xff08;空串也算子序列&#xff09; 1≤n≤100,1≤k≤1012 题解&#xff1a; 一看就是dp&#xff0c;我们先想想串a可…

P7888-「MCOI-06」Distinct Subsequences【dp】

正题 题目大意 给出一个长度为nnn的字符串aaa&#xff0c;求它的所有子序列的本质不同子序列个数。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 考虑每个子序列产生的贡献&#xff0c;为了防止算重我们一个只统计走子序列自动机上的边的子序列&#xff0c;也就是说对于TTT…

微软携手 Docker 打造 CNAB,分布式应用来了!

微软中国MSDN 前天Microsoft Connect(); 2018发布的众多最新科技&#xff0c;都让全球开发者惊艳不已。其中一项最令开发者瞩目并迫不及待——微软联合Docker发布了云本地应用捆绑包&#xff08;Cloud Native Application Bundle&#xff0c;以下简称CNAB&#xff09;&#xff…