1692 - Calafat
Enunt[edit | edit source]
Această problemă se numește Calafat pentru că a fost compusă în timpul excursiei la Calafat de mâine.
Cerinţa[edit | edit source]
Se dă un șir format din N numere naturale. Pentru fiecare valoare distinctă dintr-o subsecvență cuprinsă între doi 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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 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 maxim 100.
- Pentru alte 25% din teste se garantează că N, M ≤ 70 000
Exemplu[edit | edit source]
- calafat.in
7 3 1 3 1 2 2 1 3 2 4 2 7 3 6
- calafat.out
0 9 4
Explicație[edit | edit source]
În prima subsecvență fiecare valoare apare o singură dată, deci suma diferențelor este 0.
În a doua subsecvență:
- Valoarea 3 apare la indicii 2 și 7 rezultând diferența 7-2=5
- Valoarea 1 apare la indicii 3 și 6 => diferența 6–3=3
- Valoarea 2 apare la indicii 4 și 5 => diferența 5-4=1
Suma diferențelor este 9.
În a treia subsecvență:
- Valoarea 1 apare la indicii 3 și 6 => diferența 6–3=3
- Valoarea 2 apare la indicii 4 și 5 => diferența 5-4=1
Suma diferențelor este 4.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def main():
with open("calafat.in", "r") as fin: N, M = map(int, fin.readline().split()) sequence = list(map(int, fin.readline().split())) queries = [tuple(map(int, line.split())) for line in fin.readlines()]
with open("calafat.out", "w") as fout: for query in queries: st, dr = query subsequence = sequence[st-1:dr] distinct_values = set(subsequence) result = calculate_distances(subsequence, distinct_values) fout.write(str(result) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>