二维差分学习备忘录

二维差分

为什么我为OI泪目?因为我菜得离谱......

引入

一维差分用来O(1)修改区间,配合上一维前缀和就是O(N)的查询区间和。
差分为前缀和的逆运算。
二维差分同理。
接下来这道题就用二维差分来解决。

\(例题:地毯>>\)

地毯

题目描述

\(n\times n\) 的格子上有 \(m\) 个地毯。

给出这些地毯的信息,问每个点被多少个地毯覆盖。

输入格式

第一行,两个正整数 \(n,m\)。意义如题所述。

接下来 \(m\) 行,每行两个坐标 \((x_1,y_1)\)\((x_2,y_2)\),代表一块地毯,左上角是 \((x_1,y_1)\),右下角是 \((x_2,y_2)\)

输出格式

输出 \(n\) 行,每行 \(n\) 个正整数。

\(i\) 行第 \(j\) 列的正整数表示 \((i,j)\) 这个格子被多少个地毯覆盖。

样例 #1

样例输入 #1
5 3
2 2 3 3
3 3 5 5
1 2 1 4
样例输出 #1
0 1 1 1 0
0 1 1 0 0
0 1 2 1 1
0 0 1 1 1
0 0 1 1 1

提示

样例解释

覆盖第一个地毯后:

\(0\) \(0\) \(0\) \(0\) \(0\)
\(0\) \(1\) \(1\) \(0\) \(0\)
\(0\) \(1\) \(1\) \(0\) \(0\)
\(0\) \(0\) \(0\) \(0\) \(0\)
\(0\) \(0\) \(0\) \(0\) \(0\)

覆盖第一、二个地毯后:

\(0\) \(0\) \(0\) \(0\) \(0\)
\(0\) \(1\) \(1\) \(0\) \(0\)
\(0\) \(1\) \(2\) \(1\) \(1\)
\(0\) \(0\) \(1\) \(1\) \(1\)
\(0\) \(0\) \(1\) \(1\) \(1\)

覆盖所有地毯后:

\(0\) \(1\) \(1\) \(1\) \(0\)
\(0\) \(1\) \(1\) \(0\) \(0\)
\(0\) \(1\) \(2\) \(1\) \(1\)
\(0\) \(0\) \(1\) \(1\) \(1\)
\(0\) \(0\) \(1\) \(1\) \(1\)

数据范围

对于 \(20\%\) 的数据,有 \(n\le 50\)\(m\le 100\)

对于 \(100\%\) 的数据,有 \(n,m\le 1000\)

题解

康康数据范围,\(n<=1000\),暴力修改\(O(n^ 2)\),共有\(O(m)\)次修改,总共\(O(n^2*m)=1e9\)复杂度,洛谷能够过,但\(CCF\)肯定会把你卡死。
于是出现吧:二维差分!
首先拿来一张图,要让红色部分+1,如何\(O(1)\)解决?
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

0 0 0 0
0 0(x1,y1) 0 0
0 0 0(x2,y2) 0
0 0 0 0
差分是为了后面的前缀和做准备
我们先给\((x1,y1)+1\),可以达成增加的目的,但事情就会成这样(前缀和之后)
0 0 0 0
0 1 1 1
0 1 1 1
0 1 1 1

很显然,蓝,绿,棕四个部分都是被多加了的
于是我们再给\((x1,y2+1)-1,(x2+1,y1)-1\)来抵消影响。
但……
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 -1
这里会被减两遍
再给其+1就OK

如果遇到差分数组要初始化的情况,例如第2题,我们就将它当做边长为1的矩形差分处理即可。

CODE

#include<bits/stdc++.h>
using namespace std;
const int tsn=1e3+5;int n,m;
int qz[tsn][tsn];
int sum[tsn][tsn];int main()
{#ifndef ONLINE_JUDGEfreopen("00in.txt","r",stdin);freopen("00out.txt","w",stdout);#endifcin>>n>>m;for(int i=1;i<=m;i++){int a1,b1,a2,b2;cin>>a1>>b1>>a2>>b2;qz[a1][b1]++,qz[a1][b2+1]--,qz[a2+1][b1]--,qz[a2+1][b2+1]++;}// for(int i=1;i<=n;i++,cout<<endl)//     for(int j=1;j<=n;j++)//         cout<<qz[i][j]<<" ";cout<<endl;for(int i=1;i<=n;i++,cout<<endl)for(int j=1;j<=n;j++)sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+qz[i][j],cout<<sum[i][j]<<" ";return 0;
}


【模板】二维差分

题目描述

给你一个n行m列的矩阵,下标从1开始。

接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k

表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,

请输出操作后的矩阵。

输入格式

第一行包含三个整数\(n,m,q\).

接下来\(n\)行,每行\(m\)个整数,代表矩阵的元素

接下来\(q\)行,每行5个整数\(x1, y1, x2, y2, k\),分别代表这次操作的参数

输出格式

输出n行,每行m个数,每个数用空格分开,表示这个矩阵。

样例 #1

样例输入 #1
2 3 4
1 2 3
4 5 6
1 1 2 2 3
1 2 2 3 -1
1 1 1 3 4
1 1 2 1 1
样例输出 #1
9 8 6
8 7 5

提示

\(1≤n,m≤1000\)

\(1≤q≤10^5\)

\(1≤x1≤x2≤n\)

\(1≤y1≤y2≤m\)

\(−10^9≤矩阵中的元素≤10^9\)

\(−10^5≤k≤10^5\)

分析

注意一下上文,对你来说不是难事。

CODE

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int tsn=1e3+5;int n,m,q;
int a[tsn][tsn];
int cf[tsn][tsn];
int sum[tsn][tsn];
void _cf(int a1,int b1,int a2,int b2,int k)
{cf[a1][b1]+=k,cf[a2+1][b1]-=k,cf[a1][b2+1]-=k,cf[a2+1][b2+1]+=k;
}
signed main()
{#ifndef ONLINE_JUDGEfreopen("00in.txt","r",stdin);freopen("00out.txt","w",stdout);#endifint n,m,q;cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j],_cf(i,j,i,j,a[i][j]);while(q--){int a1,b1,a2,b2,k;cin>>a1>>b1>>a2>>b2>>k;_cf(a1,b1,a2,b2,k);}for(int i=1;i<=n;i++,cout<<endl)for(int j=1;j<=m;j++)sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+cf[i][j],cout<<sum[i][j]<<" ";return 0;
}

完结撒❀

在这里插入图片描述
在这里插入图片描述

图片来自网络。

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

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

相关文章

4.自定义的信号和槽

自定义信号 1.写到signal下 2.返回void 3.需要声明,不需要实现 4.可以有参数,可以重载 自定义槽函数 1.返回void 2.需要声明,也需要实现 3.可以有参数,可以重载 4.写到pulic slot下或者pulic或者全局函数 触发自定义的信号 1.emit 自定义信号 案例:下课后,老师触发饿了信…

Windows日志致盲与绕过

前言 在渗透测试过程中,Windows日志往往会记录系统上的敏感操作,如添加用户、写计划任务、远程登录执行等操作,对于会审计的安全运维人员或者网络管理员来说,简直就是脱掉衣服走路,被看的一清二楚。对于比较高阶的渗透操作中,要讲究的是动作无感化,来无影去无踪。而对于…

java maven项目配置及IDEA配置

一:maven作用项目管理:编译、测试、打包、部署、运行,这一套流程都可以用maven来管理。管理jar包:也就是上述提到的问题。管理插件:开发过程中会需要使用各种插件。3maven环境变量配置和Java一样,也需要配置maven环境变量。环境变量的作用在于: 可以让该程序在任何路径下…

Go并发原语之SingleFlight

引入 如下图所示,可能存在来自桌面端和移动端的用户有 1000 的并发请求,同一时刻来访问的获取文章列表的接口,获取前 20 条信息,如果这时服务直接去访问 redis 出现 cache miss, 那就会去请求 1000 次数据库,这时可能会给数据库带来较大的压力(这里的1000 只是一个例子,…

词向量的转换理解以及与真实的关系

实际上就是去除该矩阵的某一行。该矩阵实际上就是一个有N个词的300维向量,或者说该矩阵就是一个完整的词向量词汇表。而这个词汇表是通过交叉熵损失最小来构造的。 即归根到底是“在特定语料库中(包含context中共现概率),以数学方法计算输入产生哪些输出”最复合“实际情况…

盘点国内外有哪些软件测试认证

在软件测试行业,技术实力固然重要,但手握权威认证更能为职业发展增添砝码。无论你是刚入行的新人,还是经验丰富的测试工程师,获取一张含金量高的软件测试认证都能让你的职场之路更加平坦。那么,国内外有哪些值得考取的软件测试认证呢?让我们一起来盘点。 你是否正在为选择…

用友金蝶怎么选

财务知识——用友和金蝶选择谁?

概率论沉思录:合情推理

最近蔻享学术主办了每周一次的《概率论沉思录》读书会活动,恰好我也正在读该书中译版,通过该活动我了解到了不同学科的老师(数学/物理/统计/计算机)对这本书的不同理解,而我自己对该书的理解也在这个过程中逐渐深入了。于是准备每周都持续更新一下我的读书笔记。本书作者是…

八重终结 Phase 4 狱火焚天

Ending Time Octet 【八重终结】 Phase 4 Inferno Combusts 【狱火焚天】 PV on Bilibili Part 1 联合动画 Part 1 Part 2 完整音乐 涉及 AU Murder Time Trio Former Time Trio Karmatic Time Trio Chaotic Time Trio Phase 3 Chaotic Time Trio Phase 4 归冢余妄个人曲 传说之…

【grpcurl】使用grpcurl测试GRPC服务

一、场景由于我们需要访问GRPC服务的方法,便于我们进行测试,所以我们开启了grpc服务的反射机制二、安装grpcurlhttps://github.com/fullstorydev/grpcurlhttps://github.com/fullstorydev/grpcurl/releases 下载对应环境的包即可sudo dpkg -i grpcurl_1.9.1_linux_amd64.debu…

windbg 搭建双机调试环境

当我们搭建好驱动开发环境后,就可以设置双机调试了,虚拟机的安装可以参考网上其他教程,比较简单,我们直接来讲设置双击调试需要注意的一些地方。 1.设置被调试的虚拟机 首先,将虚拟机关机,如果此时已经有了串行端口存在首先移除,管道名字输入 \\.\pipe\com_1,并选择“该…

windbg 搭建双击调试环境

当我们搭建好驱动开发环境后,就可以设置双机调试了,虚拟机的安装可以参考网上其他教程,比较简单,我们直接来讲设置双击调试需要注意的一些地方。 1.设置被调试的虚拟机 首先,将虚拟机关机,如果此时已经有了串行端口存在首先移除,管道名字输入 \\.\pipe\com_1,并选择“该…