AcWing 798.差分矩阵

AcWing 798.差分矩阵

题目描述

输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上c。

请你将进行完所有操作后的矩阵输出。

输入格式

第一行包含整数n,m,q。

接下来n行,每行包含m个整数,表示整数矩阵。

接下来q行,每行包含5个整数x1, y1, x2, y2, c,表示一个操作。

输出格式

共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围

1≤n,m≤1000,
1≤q≤100000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
?1000≤c≤1000,
?1000≤矩阵内元素的值≤1000

输入样例

3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1

输出样例

2 3 4 1
4 3 4 1
2 2 2 2

题目思路

用差分思想解决,每次都对差分数组进行操作,降低复杂度
每一个a坐标都是b矩阵中上方与左方所形成的矩阵之和,
每次都对b矩阵进行操作

#include<iostream>
using namespace std;
const int N = 1e3+10;
int a[N][N],b[N][N];

void insert(int x1,int y1,int x2,int y2,int c)
{
    b[x1][y1] += c;
    b[x2+1][y1] -= c;
    b[x1][y2+1] -= c;
    b[x2+1][y2+1] += c;
}

int main()
{
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
            insert(i,j,i,j,a[i][j]);
        }
    int x1,y1,x2,y2,c;
    while(q--)
    {
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
        insert(x1,y1,x2,y2,c);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            b[i][j] = b[i-1][j] + b[i][j-1] - b[i-1][j-1] + b[i][j];
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/fsh001/p/12248695.html

时间: 2024-07-31 15:29:46

AcWing 798.差分矩阵的相关文章

ACwing : 798. 差分矩阵

不得不说之前的差分我真的是掌握的不好.. 一维差分确实简单一看就会,但是学会了之后却并不能灵活的运用. 而二维的差分我甚至还琢磨了很长时间 懒得画图所以没有图..对于二维差分的定义,百度百科是这么说的 顾名思义,就是在矩阵中,一行(一列)的元素与上一行(上一列)对应元素的差值,依次排列在上一行(上一列)元素对应所在位置. (好像说的是矩阵差分,但是问题不大) 但是只要你用模板代码打出一个差分数组就会发现这个数组的排列并不规律,换句话说我并没有看懂这个.. 因此我们完全可以忽略差分数组一个点的意义

差分矩阵

# 题意二维数组m个操作,每个操作包含x1,y1,x2,y2,c 使得在矩阵中以x x1,y1,x2,y2中的所有值都加c # 题解给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namesp

算法基础课相关代码模板

算法基础课相关代码模板 活动链接 -- 算法基础课 快速排序算法模板 -- 模板题 AcWing 785. 快速排序 void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x);

差分、前缀

差分与前缀 定义一个序列$a$,它的差分序列为$b_n=a_n-a_{n-1}$(后向差分),前缀和序列为$b_n=b_{n-1}+a_n$,显然,差分与前缀和互为逆运算,这意味着,对差分序列求前缀和就是原序列:同理,对前缀和序列求差分也是原序列. 重要结论 1.如果有了前缀序列,我们就可以O(1)求出$[l,r]$的区间和等于$b_r-b_{l-1}$ 2.如果有了差分序列,对$[l,r]$区间加$d$就意味着$b_l+d,b_{r+1}-d$ 来看一道题: 对于数列$a$,$Q$次形如$[l

康复计划#3 简单常用的几种计算自然数幂和的方法

本篇口胡写给我自己这样的东西都忘光的残废选手 以及暂时还不会自然数幂和的人- 这里大概给出最简单的几种方法:扰动法(化为递推式),斯特林数(离散微积分),高阶差分(牛顿级数),伯努利数(指数生成函数)- 不同方法的思维难度.普适程度.实现难度.时间复杂度上面都有差异-同时自然数幂和是探究各种求和方法的经典例子,了解多一点它的做法对于处理各种求和问题是有所帮助的- 问题:求$\sum_{k=0}^{n} k^t$,其中$t \in \mathbb{N}$是一个常数.要求求解的时间复杂度与$n$无关

图像的纹理特征之灰度共生矩阵

(黑灯瞎火好干事.......来源一) 由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性.灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法. Gray-level co-occurrence matrix from an image 图像的灰度共生矩阵 灰度共生矩阵是像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像在方向.间隔.变化幅度及快慢上的

机器学习实践指南:案例应用解析

试读及购买链接 <机器学习实践指南:案例应用解析>是机器学习及数据分析领域不可多得的一本著作,也是为数不多的既有大量实践应用案例又包括算法理论剖析的著作,作者针对机器学习算法既抽象复杂又涉及多门数学学科的特点,力求理论联系实际,始终以算法应用为主线,由浅入深以全新的角度诠释机器学习. 前 言第一部分 准备篇第1章 机器学习发展及应用前景 21.1 机器学习概述 21.1.1 什么是机器学习 31.1.2 机器学习的发展 31.1.3 机器学习的未来 41.2 机器学习应用前景 51.2.1 数

关于ADMM的研究(一)

关于ADMM的研究(一) 最近在研究正则化框架如何应用在大数据平台上.找到了<Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers>这篇文章,感觉很适合现在的研究.下面转载的一篇博客,写的很细致,很有用. 业界一直在谈论大数据,对于统计而言,大数据其实意味着要不是样本量增加n→∞,要不就是维度的增加p→∞,亦或者两者同时增加,并且维度与样本量的增

图像的灰度共生矩阵(转载)

Gray-level co-occurrence matrix from an image 图像的灰度共生矩阵 灰度共生矩阵是像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像在方向.间隔.变化幅度及快慢上的综合信息. 使用方法:glcm = graycomatrix(I)glcms = graycomatrix(I,param1,val1,param2,val2,...)[glcms,SI] = graycomatrix(...) 描述:glcms