# Zerojudge e346:區間和練習 ## 題敘: 給定一個長度為$n$的整數序列$A$,請回答$q$筆詢問。每筆詢問會問其中一段連續區間的總和為何。 ## 輸入&輸出說明: **輸入:** 輸入的第一行有一個整數$n$ $(1 <= n <= 200000)$,代表$A$序列的長度。 第二行有$n$個整數以空白分隔,依序表示$A$序列中的數字,其中數字的絕對值不會超過$10^9$。 第三行有一個整數$q$ $(1 <= q <= 200000)$,代表詢問的數量。 接下來有$q$行,每行有兩個個數字 $l, r$,表示詢問為序列$A$中第 $l$ 個數字到第 $r$ 個數字的總和。 *範例輸入:* 5 1 2 3 4 5 3 1 3 2 4 3 5 **輸出:** 輸出q行,每行有一個整數表示該次詢問的答案。 *範例輸出:* 6 9 12 --- ## 想法與思路: 先計算數列 $A$的前綴和數列 $S$。假設: $S_0 = 0 、 S_1 = A_1 、 S_2 = A_1 + A_2 、 …… 、 Sn = A_1 + A_2 + …… + A_n$ ,則每給定一對$l$ 、 $r$值,所求即為$S_r$$-$$S_\left(l-1\right)$ 。而不用重複地用迴圈去計算 $Al ~ Ar$ 的總和。 --- ## AC code ```cpp= #include <iostream> #define ll long long int using namespace std; int main() { ios_base::sync_with_stdio(false), cin.tie(0); ll amount, prefixSums[200000] = {0}, queries, left, right; cin >> amount; for (int i = 0; i < amount; ++i) cin >> prefixSums[i + 1], prefixSums[i + 1] += prefixSums[i]; cin >> queries; while (queries--) cin >> left >> right, cout << prefixSums[right] - prefixSums[left - 1] << '\n'; } ``` **補充:前綴和$\left( Prefix\ Sums \right)$** ```cpp= #include <iostream> using namespace std; int main() { cin.sync_with_stdio(false), cin.tie(0); int numbers, buffer; long long sums = 0; cin >> numbers; while (numbers--) cin >> buffer, cout << (sums += buffer) << ' '; cout << '\n'; } //https://zerojudge.tw/ShowProblem?problemid=e339 ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up