week5 hw B TT的貓 差分

2021-10-04 07:50:30 字數 1217 閱讀 4533

tt的貓給他出了個問題,選擇n個城市,每個城市有自己的產值,存入a[n]陣列裡,a[i]表示第i個城市的產值,接下來通過一系列操作,對某乙個範圍[l, r]內的所有城市的產值進行改變,tt需要得到所有操作結束後各城市的產值。

input:

第一行兩個數n、q,1<=n,q<=2*105,n代表城市的數量,q代表操作的個數,第二行輸入n個值,代表a[0]到a[n-1],接下來的q行,輸入l,r,c,1≤l≤r≤n,-105 =< c <= 105,代表對a[l]到a[r]內的所有城市產值加上c。

output:

一行裡面有n個數字,代表每個城市產值。

sample input:

4 2-3 6 8 4

4 4 -2

3 3 1

sample output:

-3 6 9 2

這道題最暴力的解法便是每個操作直接對每個操作範圍內的元素進行加或減運算,複雜度為o(nq),超時,而差分法將對乙個連續區間內的元素進行統一的運算可以轉化為單點操作。

原陣列 a,差分陣列 b, 陣列範圍 [1, n]

b[1] = b[1]

b[i] = a[i] - a[i-1] 。

a 陣列的區間加⇔b 陣列的單點修改

a[l]~a[r] 均加上 c 等價於 b[l] += c, b[r+1] -= c

我們對a[l]到a[r]的操作即可轉化為直接對b[l]和b[r+1](如果r+1存在的話)的單點操作,而最後求每個城市的產值則可以相加得到結果。

要注意值的範圍,取long long型別。

差分是一種很巧妙的思想,它的主要用途是維護乙個區間內統一的快速修改,將對區間的範圍操作轉變為單點操作。

#include

#include

intmain()

for(

long

long i =

0; i < q; i++

)long

long asset =0;

printf

("%lld "

, b[0]

);asset +

= b[0]

;for

(long

long i =

1; i < n; i++

)}

WEEK7 A TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...

week7 A Floyd TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...

week7 作業A TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...