当前位置:网站首页>差分(前缀和的逆运算)
差分(前缀和的逆运算)
2022-08-03 06:57:00 【疯疯癫癫才自由】
797. 差分
输入一个长度为 n
的整数序列。
接下来输入 m
个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c
。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n
和 m
。
第二行包含 n
个整数,表示整数序列。
接下来 m
行,每行包含三个整数 l,r,c
,表示一个操作。
输出格式
共一行,包含 n
个整数,表示最终序列。
数据范围
1≤n,m≤100000
,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与
* 前缀和互为逆运算;由数组a构造出数组d;
* 在原数组的一段区间内所有元素都增加一个数,则可以在差分数组中进行,
* 最后再用差分数组进行计算原数组最后的结果;
* 这样每改变一段区间内的元素的值,可用O(1)的时间完成;
* 假设在[l,r]区间内增加val值,那么怎么操作:可以想一下,a是d的前缀和,
* d[l]增加一个val,会导致a[l]及其后面的所有元素的值都增加了val,所以
* 需要在d[r+1]减去一个val,避免a[r]后面的元素也加上val;
*
* 最开始的时候,可以看成数组a的所有元素都是0,所有d的所有元素也是0;
* 后面输入一个a[i],就对数组d进行操作;
/**
* 数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与
* 前缀和互为逆运算;由数组a构造出数组d;
* 在原数组的一段区间内所有元素都增加一个数,则可以在差分数组中进行,
* 最后再用差分数组进行计算原数组最后的结果;
* 这样每改变一段区间内的元素的值,可用O(1)的时间完成;
* 假设在[l,r]区间内增加val值,那么怎么操作:可以想一下,a是d的前缀和,
* d[l]增加一个val,会导致a[l]及其后面的所有元素的值都增加了val,所以
* 需要在d[r+1]减去一个val,避免a[r]后面的元素也加上val;
*
* 最开始的时候,可以看成数组a的所有元素都是0,所有d的所有元素也是0;
* 后面输入一个a[i],就对数组d进行操作;
*/
#include <cstdio>
using namespace std;
const int N = 1e5+10;
int a[N],d[N]={0};
void Insert(int l,int r,int val)
{
d[l]+=val;
d[r+1]-=val;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
Insert(i,i,a[i]);
while(m--)
{
int l,r,val;
scanf("%d%d%d",&l,&r,&val);
Insert(l,r,val);
}
for(int i=1;i<=n;++i)
{
a[i]=a[i-1]+d[i];
printf("%d ",a[i]);
}
return 0;
}
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是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与前缀和
互为逆运算;由数组a构造出数组d;
* 子矩阵是一样的操作,画一个正方格子出来,模拟一下就明白了
/**
* 数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与前缀和
互为逆运算;由数组a构造出数组d;
* 子矩阵是一样的操作,画一个正方格子出来,模拟一下就明白了
*/
#include <cstdio>
using namespace std;
const int N = 1010;
int a[N][N],d[N][N]={0};
void Insert(int x1,int y1,int x2,int y2,int val)
{
d[x1][y1]+=val;
d[x1][y2+1]-=val;
d[x2+1][y1]-=val;
d[x2+1][y2+1]+=val;
}
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]);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
Insert(i,j,i,j,a[i][j]);
while(q--)
{
int x1,y1,x2,y2,val;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
Insert(x1,y1,x2,y2,val);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+d[i][j];
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
printf("%d ",a[i][j]);
puts(""); //输出一个空行
}
return 0;
}
边栏推荐
- Postman will return to results generated CSV file to the local interface
- Oracle Rac Cluster File Directory Migration
- PHP 获取服务器信息
- 【Shell】3万字图文讲解带你快速掌握shell脚本编程
- 华为设备配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down)
- CISP-PTE Zhenti Demonstration
- VR全景市场拓展技巧之“拓客宝典”
- 依赖注入(DI),自动配置,集合注入
- Postman will return to the interface to generate a json file to the local
- “碳中和”愿景下,什么样的数据中心才是我们需要的?
猜你喜欢
随机推荐
依赖注入(DI),自动配置,集合注入
23届微软秋招内推
解决移动端有纵向滚动条但是不能滚动的问题
DAC、ADC、FFT使用总结
用代码构建UI界面
华为设备BFD配置命令
postman将接口返回结果生成json文件到本地
- display image API OpenCV 】 【 imshow () to a depth (data type) at different image processing methods
安全狗云原生安全能力全面亮相全球数字经济大会暨ISC互联网安全大会
循环神经网络RNN基础《PyTorch深度学习实践》
PHP 获取服务器信息
boot-SSE
ORB-SLAM2提取特征点
idea远程debug
Golang协程goroutine的调度与状态变迁分析
VR全景市场拓展技巧之“拓客宝典”
MySQL日期和时间戳的转换
标准输入流
[Hello World] 二分查找笔记
PostMan使用,访问路径@RequestMapping