题目描述
输入
3 2
1 2 3
1 2 4
3 3 -2
输出
5 6 1
题目分析
O(n)复杂度必定会超时
所以需要找到一个O(1)复杂度的解题方式
此时想到前缀和
对于任意一个[l,r]的子序列,只需将a[l]加上k,a[r]减去k,再应用前缀和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
const int N = 1e5 + 5;
ll arr[N],sum[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
while(m--){
int l,r,k;
cin>>l>>r>>k;
sum[l] += k;
sum[r+1] -= k;
}
for(int i=1;i<=n;i++){
sum[i] += sum[i-1];
}
for(int i=1;i<=n;i++){
cout<<arr[i] + sum[i];
if(i!=n)cout<<" ";
else cout<<endl;
}
return 0;
}