字首和 差分

2021-10-02 12:08:54 字數 772 閱讀 4802

數列的字首和: 

sum[i]表示a[1]~a[i]的和 

用處1:求i~j的和sum[j]-sum[i-1] 

用處2:區間修改。設定乙個change陣列。當區間[i,j]上要加k時,我們令change[i]+=k,令change[j+1]-=k。如果我們對change陣列求字首和的話,字首和sum_change[i]就是i這個位置變動的值

二維陣列的差分:ans=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1] 

二維陣列的修改:用陣列c存修改資訊。在c[x1][y1]處加上a,在c[x2+1][y1]和c[x1][y2+1]處減a,在c[x2+1][y2+1]再加上a。 

最後(i,k)位置上變化的數值就是c陣列在(i,k)位置的字首和。 

題目:洛谷p1115 最大子段和

給出一段序列,選出其中連續且非空的一段使得這段和最大

解析:先求乙個字首和陣列a,列舉右端點,向左找到a[i]最小的端點

#includeusing namespace std;

const int maxn = 2e5 + 10;

typedef long long ll;

ll n,a[maxn],sum,ans,minn;

int main()

else minn = min(minn,a[i]);

}printf("%lld\n",ans);

return 0;

}

字首和 差分

有n個數和q次操作,每一次操作指明了要操作的區間 l,r 以及讓該區間內的所有元素全部加c 輸出q次操作後所有元素的大小 第一行 n q 1 n,q 2 105 第二行 n個數 a1,a2 an 106 ai 106 接下來q 行 每行3個數 l r c 表示 l,r 區間內每個數加c 1 l r ...

字首和 差分

顧名思義 用某乙個陣列來記錄陣列a前i項和,這個還可以用來求區間 l,r 的和 s r s l 1 因為第l項也在區間內 話不多說,直接上例題 leetcode 5393 ac const int maxn 1e5 5 class solution int ans 0 for int i 0 i k...

差分字首和

如果我給你一串長度為n的數列a1,a2,a3 an,再給出m個詢問,每次詢問給出l,r兩個數,要求給出區間 l,r 裡的數的和,你會怎麼做,若是沒有了解過字首和的人看到這道題的想法可能是對於m次詢問,我每次都遍歷一遍它給的區間,計算出答案,這樣子的方法固然沒錯,但是用了兩個迴圈,其時間複雜度達到了o...