Q:什么是差分数组?
A:设原数组为a数组,差分数组为b数组,b[i]=a[i]-a[i-1].
差分的核心思想,对于原数组a[1..n]中a[L~R]中每个数+c
等价于 差分数组中 b[l]+=c,b[r+1]-=c;
例如:
设原数组为 (0)1 2 3 5 15(假设数组从下标为1开始使用)
则差分数组为 (0) 1 1 1 2 10
操作: a[2~4] 中每个数+2
等价于差分数组中b[2]+=2,b[2+1]-=2;
即 差分数组为 1 3 1 2 8
最后原数组中 a[i]=a[i-1]+b[i]
即 0+1 (1) 1+3 (4)4+1(5) 5+2(7) 7+8(15)
即 原数组变为 1 4 5 7 15
题目:
输入一个长度为 nn 的整数序列。
接下来输入 mm 个操作,每个操作包含三个整数 l,r,cl,r,c,表示将序列中 [l,r][l,r] 之间的每个数加上 cc。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 nn 和 mm。
第二行包含 nn 个整数,表示整数序列。
接下来 mm 行,每行包含三个整数 l,r,cl,r,c,表示一个操作。
输出格式
共一行,包含 nn 个整数,表示最终序列。
数据范围
1≤n,m≤1000001≤n,m≤100000,
1≤l≤r≤n1≤l≤r≤n,
−1000≤c≤1000−1000≤c≤1000,
−1000≤整数序列中元素的值≤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
Ac代码:
#include<iostream>
using namespace std;
const int INF=1e8+20;
int a[INF];
int b[INF];
int n,m,l,r,c;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]); //读入原数组
b[i]=a[i]-a[i-1]; //同时构造差分数组
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&l,&r,&c);
b[l]+=c;b[r+1]-=c; //O(1)
}
for(int i=1;i<=n;i++)
{
a[i]=b[i]+a[i-1];
printf("%d ",a[i]);
}
return 0;
}
AcWing https://www.acwing.com/problem/content/description/799/