Clasa a IX-a · Frecvență, sume parțiale și ciurul lui EratosteneRead in English
Sume parțiale în C++
În engleză: Prefix sums
Ideea
s[i] = v[1] + v[2] + ... + v[i], cu s[0] = 0, se calculează într-o singură trecere: s[i] = s[i - 1] + v[i]. Apoi suma pe orice interval [st, dr] este s[dr] - s[st - 1], în O(1). Se citesc n, vectorul, apoi q întrebări (st, dr), iar pentru fiecare se afișează suma.
Descrierea în engleză
s[i] = v[1] + v[2] + ... + v[i], with s[0] = 0, is computed in a single pass: s[i] = s[i - 1] + v[i]. Then the sum over any range [st, dr] is s[dr] - s[st - 1], in O(1). n and the array are read, then q queries (st, dr), and the sum is printed for each.
- Complexitate
- O(n + q), față de O(n · q) dacă am aduna la fiecare întrebare
- Clasa
- Clasa a IX-a (Grade 9)
Exemple
Intrare
5 2 4 1 3 5 3 1 3 2 5 4 4
Ieșire așteptată
7 13 3
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: Sume parțiale
* Clasa: 9
* Capitol: Frecvență, sume parțiale și ciurul lui Eratostene
* Descriere: s[i] = v[1] + v[2] + ... + v[i], cu s[0] = 0, se calculează într-o
* singură trecere: s[i] = s[i - 1] + v[i]. Apoi suma pe orice interval
* [st, dr] este s[dr] - s[st - 1], în O(1). Se citesc n, vectorul,
* apoi q întrebări (st, dr), iar pentru fiecare se afișează suma.
* Complexitate: O(n + q), față de O(n · q) dacă am aduna la fiecare întrebare
*
* Exemplu
* Intrare:
* 5
* 2 4 1 3 5
* 3
* 1 3
* 2 5
* 4 4
* Ieșire:
* 7
* 13
* 3
*/
#include <iostream>
using namespace std;
long long s[100001];
int main()
{
int n, q, x;
cin >> n;
s[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> x;
s[i] = s[i - 1] + x;
}
cin >> q;
for (int k = 1; k <= q; k++)
{
int st, dr;
cin >> st >> dr;
cout << s[dr] - s[st - 1] << '\n';
}
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.