题目
https://www.acwing.com/problem/content/799/
思路
创建一个原数组a 构造一个数组b 输入数组a 然后将数组a的元素 进行 差分 赋值给 数组b 核心思想:差分
b[l] =b[l] + value;
b[r+1] -=b[r] - value;
这样就达到了 部分区间元素加值 的效果 时间复杂度O( 1 )
代码
#include<iostream>
using namespace std;
const int N = 1e6+5;
int a[N], b[N];
void insert(int l , int r , int value){
b[l] += value;
b[r + 1] -= value;
}
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 r,l,value;
scanf("%d%d%d",&r,&l,&value);
insert (l,r,value);
}
for (int i = 1;i <= n; i ++ ) printf("%d ",b[i]);
return 0;
}
|