初論差分
介紹:
其實最好用的時候是對於一段區間的值就行修改,並且是離線的!
那麼用差分就是最好的了,將O(n)的複雜度變成了O(1)的點修改!
講解
5 6 12 7 9
那麼類似的,我們用前綴的思想來處理相鄰的差值!
所以存在了dif[ ] 數組裏面!
那麼如果我們將 區間 2~ 4 加上了 98 那麼我們的暴力做法就是用一個循環來 保證,
但是我們可以直接將
就變成了:
dif[1]=5,dif[2]=99,dif[3]=6,dif[4]=−5,dif[5]=−97
那麼最後結尾的時候,只要將前綴來相加就可以了!
a[1]=dif[1]+dif[0] = 5
a[2]=dif[2]+dif[1]=104 —dif[2]=104
a[3]=dif[3]+dif[2]=110 —dif[3]=110
a[4]=dif[4]+dif[3]=105 —dif[4]=105
a[5]=dif[5]+dif[4]=9 —dif[5]=9
代碼:
#include <bits/stdc++.h>
#define N 10005
using namespace std;
int n,m,a[N],dif[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
dif[1]=a[1];
for(int i=2; i<=n; i++)
dif[i]=a[i]-a[i-1];
for(int i=1; i<=m; i++)
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
dif[l]+=x;
dif[r+1]-=x;
}
for(int i=1; i<=n; i++)
{
dif[i]+=dif[i-1];
printf("%d ",dif[i]);
}
return 0;
}