Această problemă se numește Calafat pentru că a fost compusă în timpul excursiei la Calafat de mâine.
Cerința
Se dă un șir format din N
numere naturale. Pentru fiecare valoare distinctă dintr-o subsecvență cuprinsă între 2
indici st
si dr
considerăm distanța dintre indicii primei și ultimei apariții ale acesteia în cadrul subsecvenței. Dându-se M
subsecvențe de forma [st,dr]
, se cere să se calculeze suma distanțelor corespunzătoare tuturor valorilor distincte din subsecvență.
Date de intrare
Fișierul de intrare calafat.in
conține pe prima linie două numere natural N
și M
. Pe a doua linie se vor afla cele N
numere din șirul dat. Pe următoarele M
linii se vor afla câte două numere st
și dr
, cu semnificația că vrem să calculăm suma menționată mai sus pentru subsecvența [st,dr]
.
Date de ieșire
Fișierul de ieșire calafat.out
va conține M
numere naturale, câte unul pe fiecare linie, reprezentând cele M
sume cerute.
Restricții și precizări
1 ≤ N, M ≤ 200000
1 ≤ st ≤ dr ≤ N
- Valorile din șir se vor afla în intervalul
[1, N]
- Pentru 20% din teste se garantează că
N, M ≤ 1000
- Pentru alte 25% din teste se garantează că
N, M ≤ 35 000
iar numărul de elemente distincte din șir este maxim100
. - Pentru alte 25% din teste se garantează că
N, M ≤ 70 000
Exemplu
calafat.in
7 3 1 3 1 2 2 1 3 2 4 2 7 3 6
calafat.out
0 9 4
Explicație
În prima subsecvență fiecare valoare apare o singură dată, deci suma diferențelor este 0
.
În a doua subsecvență:
- Valoarea
3
apare la indicii2
și7
rezultând diferența7-2=5
- Valoarea
1
apare la indicii3
și6
=> diferența6–3=3
- Valoarea
2
apare la indicii4
și5
=> diferența5-4=1
Suma diferențelor este 9
.
În a treia subsecvență:
- Valoarea
1
apare la indicii3
și6
=> diferența6–3=3
- Valoarea
2
apare la indicii4
și5
=> diferența5-4=1
Suma diferențelor este 4
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Calafat:
#include <fstream>
#include <cassert>
#include <vector>
using namespace std;
ifstream f("calafat.in");
ofstream g("calafat.out");
const int Nmax = 200000;
const int Qmax = 200000;
const int Q = Qmax + 10;
const int N = Nmax + 10;
vector<pair<int, int> > qr[N];
pair<int, int> upd[N];
long long sol[Q], A[N];
int last[N], n, q, l, r, x;
void update(int p, int x) {
for(; p <= n; p += p & -p) {
A[p] += x;
}
}
long long find(int p) {
long long sum = 0;
for (; p; p -= p & -p) {
sum += A[p];
}
return sum;
}
int main () {
f >> n >> q;
assert(n >= 1 && n <= Nmax);
assert(q >= 1 && q <= Qmax);
for (int i = 1; i <= n; ++i) {
f >> x;
assert(x >= 1 && x <= Nmax);
if (!last[x]) {
last[x] = i;
} else {
upd[i] = make_pair(last[x], i - last[x]);
last[x] = i;
}
}
for (int i = 1; i <= q; ++i) {
f >> l >> r;
assert(l <= r && 1 <= l && l <= n && 1 <= r && r <= n);
qr[r].push_back(make_pair(l, i));
}
for (int i = 1; i <= n; ++i) {
if (upd[i].first) {
update(upd[i].first, upd[i].second);
}
for (auto &it : qr[i]) {
sol[it.second] = find(i) - find(it.first - 1);
}
}
for (int i = 1; i <= q; ++i) {
g << sol[i] << "
";
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1692 Calafat
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1692 Calafat de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!