初論差分

初論差分

介紹:

其實最好用的時候是對於一段區間的值就行修改,並且是離線的!
那麼用差分就是最好的了,將O(n)的複雜度變成了O(1)的點修改!

講解

5!

5  6  12  7  9

那麼類似的,我們用前綴的思想來處理相鄰的差值!
所以存在了dif[ ] 數組裏面!
dif[1]=5,dif[2]=1,dif[3]=6,dif[4]=5,dif[5]=2

那麼如果我們將 區間 2~ 4 加上了 98 那麼我們的暴力做法就是用一個循環來 保證,
但是我們可以直接將dif[2]+=98,dif[5]=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;
}
發佈了57 篇原創文章 · 獲贊 76 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章