首页 > 【模板】二维差分
头像 bibibibi
发表于 2021-11-07 17:09:48
描述 给一个长度为nnn的数组aaa,mmm次操作,左上角为(x1,y1)(x_1,y_1)(x1​,y1​),右下角为(x2,y2)(x_2,y_2)(x2​,y2​)加kkk,问mmm次操作后的数组 思路 差分模板题,由于仅有一次查询,因此可以利用前缀和的性质,设数组sumsumsum表示mm 展开全文
头像 xqxls
发表于 2021-11-02 12:09:46
题意整理。 给定一个n行m列的矩阵,对这个矩阵进行q次操作,每次操作给定5个参数x1, y1, x2, y2, k,每次操作把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k。 求q次操作之后的矩阵。 方法一(差分数组) 1.解题思路 思路和一维差分的情况非常相似,只 展开全文
头像 静寂旮旯
发表于 2022-05-05 12:38:06
解题思路: 建立差分二维数组,每一行按照一维差分数组建立cf[i][j]=v[i][j]−v[i][j−1],(1≤i≤n,1≤j≤m)cf[i][j] = v[i][j] - v[i][j-1],(1 \leq i \leq n,1 \leq j \leq m)cf[i][j]=v[i][j]− 展开全文
头像 向光而行的你很犹豫
发表于 2023-04-27 21:28:35
#include<iostream> using namespace std; const int N = 1010; long long a[N][N], b[N][N]; void insert(int x1, int y1, int x2, int y2, int c) { 展开全文
头像 寒武子星
发表于 2021-12-07 16:43:40
思路:创建一个DP数组,把每次操作修改的起始位置,修正的起始位置记录。利用前缀和把要修改位置填上修改值。最后把DP数组和原始列表相叠加。 while True: try: n, m, q = map(int, input().split()) l = [] 展开全文
头像 其实是牛哥
发表于 2021-10-19 15:22:32
【模板】二维差分 难度:3星 类似二维前缀和的套路,开一个差分数组 sumsumsum,对于左上角 (x1,y1)(x_1,y_1)(x1​,y1​) 、右下角 (x2,y2)(x_2,y_2)(x2​,y2​) 的矩形所有数加上 kkk ,我们只需要把 sum[x1][y1]sum[x_1][y_ 展开全文
头像 言言7
发表于 2023-03-29 21:39:37
#include<iostream> #include<string.h> using namespace std; typedef long long ll; ll g[1005][1005],sum[1005][1005],d[1005][1005]; int main( 展开全文
头像 文和906
发表于 2021-10-29 11:46:35
和#【模板】差分#的思路完全一致。使用一个二位数组sum来记录每一位改变的信息,然后通过求前缀和的形式求出每一位一一对应的改变值。最后将sum中的每一个元素与原始数组arr中对应的元素加起来即可得到结果数组。唯一有区别的地方在记录改变信息以及求前缀和上的操作略微复杂化。这里记录的方式与求前缀和的方式 展开全文
头像 papapiu
发表于 2025-04-20 10:17:56
我们需要处理一个矩阵的多次子矩阵加法操作。直接对每个子矩阵元素逐个加k的方法在q很大时会很慢(O(qnm))。为了高效处理,可以使用二维差分数组的方法,将每次子矩阵加k的操作转换为对差分数组的四个角的操作(O(1)),最后通过计算差分数组的前缀和来得到最终矩阵(O(n*m))。 #include & 展开全文
头像 TonyBryant
发表于 2024-04-07 11:32:35
// 记得在外围添加一圈0,差分可能会导致越界访问 // 初始模板一定要是全零,将初始数据以差分的形式添加,不能直接添加,会出错 // 详细看 61~67 行 // 添加一个数的差分: // // ------------------- // |(a,b)+k 展开全文