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
-
- 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
-
- 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;
-
- }
-
-
-
-