題目鏈結
問題描述如果每次修改都修改從l到r的值的話,一定會tle。 使用差分陣列。小朋友排成一排,老師給他們分蘋果。
小朋友從左到右標號1..n。有m個老師,每次第i個老師會給第li個到第ri個,一共ri-li+1個小朋友每人發ci個蘋果。
最後老師想知道每個小朋友有多少蘋果。
差分陣列(差分數列):
對於乙個陣列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...