原题链接
题解
分析
- 使用循环进行操作时,效率是o(r-l),而使用差分,效率是o(1)
- 差分就是前缀和的逆操作,将差分数组这里叫为b,
b[l]+c
,就可以使l后面所有项的值都增加,然后b[r+1]-c
,将r后面的项还原回去,而题中给的l与r都是从1开始的,所以b[l-1]+c
b[r]-c
- 最后使用一个数组,这里称为c,将差分数组进行前缀和操作,最后输出即可。
代码
#include "iostream"
const int N=100010;
using namespace std;
int num[N]={0};
int b[N]={0};
int d[N]={0};
int main(){
int n1,n2,l,r,c;
cin>>n1>>n2;
for(int i=0;i<n1;i++){
cin>>num[i];
if(i!=0){
b[i]=num[i]-num[i-1];
}
else b[i]=num[i];
}
for(int i=0;i<n2;i++){
cin>>l>>r>>c;
b[l-1]+=c;
b[r]-=c;
}
d[0]=b[0];
for(int i=0;i<n1;i++){
if(i!=0)d[i]+=b[i]+d[i-1];
cout<<d[i]<<' ';
}
}
标签:int,差分,num,数组,n1,n2,acwing
From: https://www.cnblogs.com/ChengMao/p/17114588.html