演算法提高 分蘋果 差分陣列

2021-09-10 16:49:08 字數 1131 閱讀 9199

題目鏈結

問題描述

小朋友排成一排,老師給他們分蘋果。

小朋友從左到右標號1..n。有m個老師,每次第i個老師會給第li個到第ri個,一共ri-li+1個小朋友每人發ci個蘋果。

最後老師想知道每個小朋友有多少蘋果。

如果每次修改都修改從l到r的值的話,一定會tle。 使用差分陣列。

差分陣列(差分數列):

對於乙個陣列a[ ],其差分陣列d[i]=a[i]-a[i-1] (i>0)且d[0]=a[0]

令sumd[i]=d[0]+d[1]+d[2]+…+d[i] (sumd[ ]是差分陣列d[ ]的字首和) 則sumd[i]=a[0]+a[1]-a[0]+a[2]-a[1]+a[3]-a[2]+…+a[i]-a[i-1]=a[i] 即a[i]的差分陣列是d[i], 而d[i]的字首和是a[i]

注意特殊處:這道題是先進行整體區間修改,最後才統一查詢。 所以,我們只要維護乙個差分陣列就行了。 

維護差分陣列,對於將區間[l,r]加c,我們只需要將d[l]+c和d[r+1]-c 當修改完畢後,最後遞推累加,這樣只需要計算一次就能得到結果。

差分陣列其實就相當於通過改變區間前端和末端與其他部分的差值,在最後進行累加的時候實行對整個區間的值的改變。

但為什麼要存差值呢?————因為數列中的數滿a[i]=sum,便於用遞推求得最後的值。

int main(int argc, char** ar**)

for(int i = 1; i <= n; i++)

return 0;}

輸入格式

第一行兩個整數n、m,表示小朋友個數和老師個數。

接下來m行,每行三個整數li、ri、ci,意義如題目表述。

輸出格式

一行n個數,第i個數表示第i個小朋友手上的水果。

樣例輸入

5 31 2 1

2 3 2

2 5 3

樣例輸出

1 6 5 3 3

資料規模和約定

40%的資料,n、m≤1 000。

100%的資料,n、m≤100 000,1≤li≤ri≤n,0≤ci≤100。

演算法提高 分蘋果

問題描述 小朋友排成一排,老師給他們分蘋果。小朋友從左到右標號1.n。有m個老師,每次第i個老師會給第li個到第ri個,一共ri li 1個小朋友每人發ci個蘋果。最後老師想知道每個小朋友有多少蘋果。輸入格式 第一行兩個整數n m,表示小朋友個數和老師個數。接下來m行,每行三個整數li ri ci,...

演算法提高 分數統計

問題描述 2016.4.5已更新此題,此前的程式需要重新提交。問題描述 給定乙個百分制成績t,將其劃分為如下五個等級之一 90 100為a,80 89為b,70 79為c,60 69為d,0 59為e 現在給定乙個檔案inp,檔案中包含若干百分制成績 成績個數不超過100 請你統計五個等級段的人數,...

演算法提高 分數統計

題目 輸入格式 若干0 100的正整數,用空格隔開?輸入有點坑,題目意思是輸入直到eof結束,結果測試檔案多了乙個輸入的成績總數。include include include using namespace std int main else if m 80 else if m 70 else i...