
一、核心思路
采用差分数组的思想,将原数组某个区间上的修改转化为差分数组边界上两点值的修改。反过来再利用用前缀和来还原原数组。
差分数组
还原原数组
二、代码实现
cpp
typedef long long LL;
const int N = 1e6;
int n, q;
LL a[N], f[N];
int main ()
{
cin >> n >> q;
// 公式来构造差分数组
for (int i = 1; i <= n; i++)
{
cin >> a[i];
f[i] = a[i] - a[i-1];
}
// 执行操作
while(q--)
{
int l, r, d; cin >> l >> r >> d;
f[l] += d;
f[r+1] -= d;
}
// 利用前缀和还原原数组
for (int i = 1; i <= n; i++)
{
a[i] = a[i-1] + f[i];
cout << a[i] << " ";
}
return 0;
}
cpp
typedef long long LL;
const int N = 1e6;
int n, q;
LL f[N];
int main ()
{
cin >> n >> q;
// 利用性质来构造差分数组
for (int i = 1; i <= n; i++)
{
int x; cin >> x;
f[i] += x;
f[i+1] -= x;
}
// 执行操作
while(q--)
{
int l, r, d; cin >> l >> r >> d;
f[l] += d;
f[r+1] -= d;
}
// 利用前缀和还原原数组
for (int i = 1; i <= n; i++)
{
f[i] = f[i-1] + f[i];
cout << f[i] << " ";
}
return 0;
}