当前位置:网站首页>差分(前缀和的逆运算)
差分(前缀和的逆运算)
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;
}
边栏推荐
猜你喜欢
随机推荐
现货黄金分析的主要流派
学习笔记:机器学习之逻辑回归
Oracle Rac Cluster File Directory Migration
keepalived安装部署
一文搞懂什么是@Component和@Bean注解以及如何使用
Roson的Qt之旅#106 QML在图片上方放置按钮并实现点击按钮切换图片
力扣(LeetCode)214. 打家劫舍 II(2022.08.02)
volta管理node版本
postman将接口返回结果生成json文件到本地
MySQL - 视图操作
static数据成员
DSP-ADAU1452输出通道配置
控制bean的加载
线程基础(二)
PHP 获取服务器信息
Oracle Rac 集群文件目录迁移
excel高级绘图技巧100讲(二十一)- Excel层叠柱形图
HCIP笔记整理 2022/7/20
数据库表结构文档 生成工具screw的使用
STL-vector容器