c++ 题解 | #【模板】二维差分#

【模板】二维差分

https://www.nowcoder.com/practice/50e1a93989df42efb0b1dec386fb4ccc

二维差分
假设a是输入的原矩阵,目标是给定矩形范围,在O(1)时间内将给定矩形范围子矩阵所有值都加上c。可以利用差分的方式。假设b是a的二维差分矩阵,那重点是:a是b的前缀和矩阵。即a[i][j]是b矩阵左上角(1,1)到右下角(i,j)的子矩阵和。 那类似于一维差分,当在差分矩阵b上进行加c,对应的其前缀和矩阵a(原始矩阵)就会影响到了起始点之后的空间的值(它们是包含加c了的矩阵b的前缀和矩阵a中部分)

  1. 那在b上某个矩形上加了c,是如何影响其前缀和矩阵a的呢:
    假设矩形左上角是(x1,y1),矩形右下角是(x2,y2),在输入的矩阵a中红色区域的值都加上c。则有:
    当 b[x1][y1] += c : 如图,让图1中所示的矩阵a中蓝色区域的值都加上了c。
    当 b[x1][y2+1] -=c ,则让a中绿色区域的值都减去了c
    当 b[x2+1][y1] -= c,则让a中黄色区域的值都减去了c
    当 b[x2+1][y2+1] += c, 则让a中紫色区域都加上了c
    目标是从蓝色框减去绿色和黄色,但多减了一个紫色区域,所以最后再加上一个紫色区域。
    alt

  2. 如何构造差分矩阵b呢
    将上面四个操作封装成一个insert函数,不断调用insert函数,传入的c是a[i][j]

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1010;
typedef long long LL;
LL 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("%lld", &a[i][j]);
        }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            insert(i, j, i, j, a[i][j]);
        }
    int x1, y1, x2, y2, c;

    for (int i = 1; i <= q; i++) {
        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];
        }
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++) {
            printf("%lld ", b[i][j]);
        }
        printf("\n");
    }
        
    return 0;
}
// 64 位输出请用 printf("%lld")
全部评论

相关推荐

09-16 14:43
已编辑
江娱互动_研发_客户端开发
背景&nbsp;双一流本硕&nbsp;双非大圆满&nbsp;只找游戏开发相关的岗位。&nbsp;8&nbsp;月初开始秋招到现在&nbsp;投了四五十家吧,&nbsp;目前两&nbsp;offer,&nbsp;不打算继续投了,把剩下的流程走完就开始沉淀了。目前两&nbsp;offer&nbsp;一个是网易互娱测开&nbsp;base&nbsp;广州,一个是江娱互动客户端开发&nbsp;base&nbsp;北京。应该确定网易这个了,说实话北京这个我挺想去的,这家的产品和工作氛围我了解了也不错,是那种踏实做事的,可惜我是广东人。网易的测开是调剂的二志愿,看了下有内部转岗机会,所以打算后面找个时间提前实习,沉淀下再做一个&nbsp;demo&nbsp;作品,写一些&nbsp;shader,增强下图形学渲染的能力,再学点编辑器开发。看到时候内部转岗或者春招继续投客户端开发这样。后面还能再动摇的话应该就灵犀或者腾子了吧(假如这两家确认的是客户端开发岗的话)。-----------------------补下timeline网易互娱&nbsp;测开&nbsp;8.2笔试&nbsp;&nbsp;8.21&nbsp;技术面&nbsp;&nbsp;8.29&nbsp;leader&amp;HRBP面(终面)&nbsp;9.8&nbsp;录用审核(之前一直显示面试中)9.14&nbsp;oc江娱互动&nbsp;客户端开发&nbsp;8.29主程面&nbsp;9.3&nbsp;制作人面&nbsp;9.5&nbsp;BOSS面&nbsp;9.11&nbsp;口头OC&nbsp;9.15&nbsp;正式offer后面考虑了一下&nbsp;&nbsp;感觉还是能走开发就开发吧,测开不太感兴趣,要内部活水转岗还要满1年才能申请。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 你的mentor是什么样的人? #
4267次浏览 31人参与
# 你觉得mentor喜欢什么样的实习生 #
10550次浏览 297人参与
# 智慧芽求职进展汇总 #
18201次浏览 108人参与
# 帮我看看,领导说这话什么意思? #
6524次浏览 26人参与
# 26届秋招公司红黑榜 #
12894次浏览 43人参与
# 怎么给家人解释你的工作? #
1546次浏览 16人参与
# 平安产险科技校招 #
2419次浏览 0人参与
# 没有家庭托举的我是怎么找工作的 #
12495次浏览 160人参与
# 求职低谷期你是怎么度过的 #
5340次浏览 93人参与
# 实习必须要去大厂吗? #
146738次浏览 1541人参与
# 从哪些方向判断这个offer值不值得去? #
6666次浏览 95人参与
# 同bg的你秋招战况如何? #
158847次浏览 927人参与
# 度小满求职进展汇总 #
10155次浏览 53人参与
# 校招泡的最久的公司是哪家? #
4711次浏览 23人参与
# 面试紧张时你会有什么表现? #
1755次浏览 21人参与
# 你有哪些缓解焦虑的方法? #
37191次浏览 835人参与
# 你喜欢工作还是上学 #
77605次浏览 860人参与
# 入职第一天,你准备什么时候下班 #
85503次浏览 467人参与
# 秋招想进国企该如何准备 #
97733次浏览 487人参与
# 简历无回复,你会继续海投还是优化再投? #
103600次浏览 819人参与
# 机械人的工作环境真的很差吗 #
25062次浏览 119人参与
# 独居后,你的生活是更好了还是更差了? #
28139次浏览 263人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务