首页 > 其他分享 >二维树状数组小记

二维树状数组小记

时间:2024-12-13 21:09:12浏览次数:7  
标签:单点 树状 int sum leftarrow times 二维 小记

LG1527,发现自己竟然还不会二维树状数组,赶紧恶补一下。

下面的内容是随手写的,原理不是很难

单点改,区间查

void update(int x,int y,int v){
	for(int i=x;i<=n;i+=lowbit(i)){
		for(int j=y;j<=m;j+=lowbit(j))
			c[i][j]+=v;
	}
}
int getsum(int x,int y,int v=0){
	for(int i=x;i;i-=lowbit(i)){
		for(int j=y;j;j-=lowbit(j))
			v+=c[i][j];
	}
	return v;
}

最后答案统计

\[\sum_{i=a}^{c}\sum_{i=b}^{d}a_{i,j}=s_{c,d}-s_{c-1,d}-s_{c,d-1}+s_{c-1,d-1} \]

区间改,单点查

定义差分数组 \(d_{i,j}\),每次修改操作 \(d_{a,b}\leftarrow +v,d_{c+1,b}\leftarrow-v,d_{a,d+1}\leftarrow-v,d_{c+1,d+1}\leftarrow+v\)

\[a_{x,y}=\sum_{i=1}^{x}\sum_{j=1}^{y}d_{i,j} \]

转化为单点改,区间查

区间改,区间查询

\[\begin{align} s_{x,y}&=\sum_{i=1}^{x}\sum_{j=1}^{y}a_{i,j}\\ &=\sum_{i=1}^{x}\sum_{j=1}^{y}\sum_{k=1}^{i}\sum_{l=1}^{j}d_{k,l}\\ &=\sum_{i=1}^{x}\sum_{j=1}^{y}d_{i,j}\times(x-i+1)(y-j+1)\\ &=(x+1)(y+1)\sum_{i=1}^{x}\sum_{j=1}^y d_{i,j}-(x+1)\sum_{i=1}^{x}\sum_{j=1}^{y}d_{i,j}\times j-(y+1)\sum_{i=1}^{x}\sum_{j=1}^{y}d_{i,j}\times i+\sum_{i=1}^{x}\sum_{j=1}^{y}d_{i,j}\times ij \end{align} \]

额外维护 \(d_{i,j}\times j,d_{i,j}\times i,d_{i,j}\times ij\) 的二维前缀和即可

LG4514 上帝造题的七分钟

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int>ttfa;

const int N=2050;
inline int lowbit(int x){return x&-x;}

int n,m;
struct BIT_2di{
	int c[N][N];
	void update(int x,int y,int v){
		for(int i=x;i<=n;i+=lowbit(i)){
			for(int j=y;j<=m;j+=lowbit(j))
				c[i][j]+=v;
		}
	}
	int getsum(int x,int y,int v=0){
		for(int i=x;i;i-=lowbit(i)){
			for(int j=y;j;j-=lowbit(j))
				v+=c[i][j];
		}
		return v;
	}
}s,si,sj,sij;

void sij_update(int x,int y,int v){
	s.update(x,y,v);
	si.update(x,y,v*x);
	sj.update(x,y,v*y);
	sij.update(x,y,v*x*y);
}
int sij_getsum(int x,int y,int v=0){
	v+=(x+1)*(y+1)*s.getsum(x,y);
	v-=(x+1)*sj.getsum(x,y);
	v-=(y+1)*si.getsum(x,y);
	v+=sij.getsum(x,y);
	return v;
}

int main(){
	char opt[3];
	scanf("%s%d%d",opt,&n,&m);
	while(scanf("%s",opt)!=EOF){
		int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
		if(opt[0]=='L'){
			int v;scanf("%d",&v);
			sij_update(a,b,v);
			sij_update(c+1,b,-v);
			sij_update(a,d+1,-v);
			sij_update(c+1,d+1,v);
		}else{
			int v=0;
			v+=sij_getsum(c,d);
			v-=sij_getsum(a-1,d);
			v-=sij_getsum(c,b-1);
			v+=sij_getsum(a-1,b-1);
			printf("%d\n",v);
		}
	}
	return 0;
}

标签:单点,树状,int,sum,leftarrow,times,二维,小记
From: https://www.cnblogs.com/BigSmall-En/p/18605845

相关文章

  • 【寻迹#7】树状数组
    树状数组一、简介树状数组是一种支持单点修改和区间查询的,代码量小的数据结构。普通树状数组维护的信息及运算要满足结合律且可差分,如加法(和)、乘法(积)、异或等。事实上,树状数组能解决的问题是线段树能解决的问题的子集:树状数组能做的,线段树一定能做;线段树能做的,树状数组......
  • 靶场命令执行及绕过小记
    使用的是DVWA的靶场进行命令执行 简单难度非常容易进行命令执行,加上&符,可同步进行其他命令,中级的dvwa命令执行,只过滤了&&,可以通过其他的进行绕过  高级难度命令执行过滤了大部分的管道符替换为空 但是可以通过管道符的空格进行绕过......
  • ABAP delet 内表小记
    *只有当记录的年份(zyear)不在s_year数组中,*并且月份(zmonat)也不在s_monat数组中时,才会删除这条记录。*换句话说,只有同时满足这两个条件的记录才会被删除。  DELETE gt_item WHERE zyear  NOT IN s_year[]                   AND zmonat NOT IN ......
  • C语言基础:数组(二维数组)
    数组二维数组定义:二维数组本质上是一个行列式的组合,也就是说二维数组是由行和列两部分组成。二维数组数据是通过行列解读。二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。(也就是说数组的元素可以是数组类型)。语法 类型......
  • 二维BIT
    简介实际上是树状数组套树状数组,用二维数组维护。支持区间操作。算法流程模板题:P4514上帝造题的七分钟考虑对二维差分数组作二阶二维前缀和。考虑对\((i,j)\)加\(d\)对查询以\((x,y)\)为矩形右下角的贡献。此时对于所有的\(a_{i\simx,j\simy}\)都有\(d\)的贡献,......
  • 一个简单的整数问题(树状数组区间修改,单点查询)
    给定长度为 NN 的数列 AA,然后输入 MM 行操作指令。第一类指令形如 Clrd,表示把数列中第 l∼rl∼r 个数都加 dd。第二类指令形如 Qx,表示询问数列中第 xx 个数的值。对于每个询问,输出一个整数表示答案。输入格式第一行包含两个整数 NN 和 MM。第二行包含......
  • 从 动态前缀和 到 树状数组
    一.引言——动态前缀和前缀和求解我会在最后给出,想看的直接翻到最后,这里默认大家都知道前缀和怎么求解。有这么一个场景,我们需要不断修改数组中的元素,并且问我们数组内某个区间的和。如果使用最原始的前缀和来求解,每次我们都要重新求一遍sum[],更新时间复杂度是O(n)的,查询是O(1)的......
  • 树状数组进阶
    树状数组是众多数据结构中常数较小,简单好写的,很多ds题都应该优先考虑树状数组。接下来介绍树状数组的几种常见套路。单点加,区间求和区间加,单点查询区间加,区间求和二维树状数组,包括上面\(3\)个操作单点修改,求全局\(k\)小值求前驱,后继,排名等平衡树操作......
  • C语言基础-数组:一维数组与二维数组
    数组例子如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,假如我们要在程序中表示一组成绩,此时我们所学的常规的数据类型就无法再表示,这时就需要使用一种新的表现形式,这种表现形式就是数组什么是数组数组是相同类型,有序数据的集合数组的特征数组中的数据......
  • 第二类斯特林数小记
    随便记点。定义第二类StirlingNumber。latex:$\begin{Bmatrix}n\\m\end{Bmatrix}$或n\bracem,大小渲染可能有差别。我们定义\(\begin{Bmatrix}n\\m\end{Bmatrix}\)表示将\(n\)个不同的球放进\(m\)个相同非空盒子的方案数。求法考虑类似DP地求出\(\begin{Bmatrix......