3059 - Lexicografic
Enunt[edit | edit source]
Se dă un șir v format din N elemente naturale nenule nu neapărat distincte. Asupra șirului putem aplica un singur tip de operație: interschimbarea a două elemente aflate pe poziții consecutive.
Cerinţa[edit | edit source]
Dându-se un număr natural K, se cere șirul minim lexicografic ce se poate obține prin aplicarea a cel mult K interschimbări de elemente de pe poziții consecutive.
Date de intrare[edit | edit source]
În fișierul lexicografic.in se află pe prima linie T, reprezentând numărul de teste. Urmează cele T teste, fiecare pe câte două linii. Pe prima linie din cadrul unui test se află două numere N și K separate prin spațiu. Pe linia a doua din cadrul unui test se află cele N elemente ale șirului v separate prin spații.
Date de ieșire[edit | edit source]
În fișierul lexicografic.out se vor afișa cele T linii, câte una corespunzătoare răspunsului pe fiecare test. Linia corespunzătoare unui test va conține cele N elemente separate prin spații ale șirului minim lexicografic ce s-a obținut din șirul inițial, după aplicarea a cel mult K interschimbări de elemente de pe poziții consecutive.
Restricţii şi precizări[edit | edit source]
- 1 ≤ N ≤ 250.000;
- T ≤ 2500;
- într-un fișier de intrare suma totală a lungimilor șirurilor corespunzătoare celor T teste nu va depăși 250.000;
- 1 ≤ K ≤ N*(N-1)/2;
- 1 ≤ v[i] ≤ N, pentru 1 ≤ i ≤ N;
- Vă rugăm să acordați atenție tipului de date necesar pentru a citi valoarea lui K;
- Pentru acordarea punctajului pe un fișier de test este necesară rezolvarea corectă a tuturor celor T teste;
- Pentru teste în valoare de 5 puncte se garantează K = N * (N – 1) / 2;
- Pentru alte teste în valoare de 7 puncte se garantează K = 1;
- Pentru alte teste în valoare de 23 de puncte se garantează T ≤ 10, N ≤ 50;
- Pentru alte teste în valoare de 4 puncte se garantează T ≤ 10, N ≤ 100;
- Pentru alte teste în valoare de 12 puncte se garantează T ≤ 10, N ≤ 500;
- Pentru alte teste în valoare de 24 de puncte se garantează T ≤ 10, N ≤ 2000;
- Un șir a1, a2, …, an este mai mic lexicografic decât un alt șir b1, b2, …, bn dacă există un număr întreg P mai mic sau egal cu N astfel * încât: a1 = b1, a2 = b2, … , aP-1 = bP-1, iar aP < bP.
Exemplul 1[edit | edit source]
- lexicografic.in
3 5 2 4 2 3 1 1 4 3 2 1 3 4 6 4 5 3 5 3 4 6
- lexicografic.out
2 3 4 1 1 1 2 3 4 3 3 5 4 5 6
Explicație[edit | edit source]
Pentru primul test: Șirul este format din N = 5 elemente, și anume v=(4,2,3,1,1). Putem efectua K=2 interschimbări. Interschimbând elementele v[1] și v[2] obținem șirul (2,4,3,1,1), apoi după interschimbarea elementelor v[3] și v[2] se obține șirul minim lexicografic (2,3,4,1,1).
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def min_lexicographic_sequence(N, K, v):
for _ in range(min(K, N)): for i in range(N - 1): if v[i] > v[i + 1]: v[i], v[i + 1] = v[i + 1], v[i] return v
def main():
with open("lexicografic.in", "r") as fin, open("lexicografic.out", "w") as fout: T = int(fin.readline()) for _ in range(T): N, K = map(int, fin.readline().split()) v = list(map(int, fin.readline().split())) min_lex_seq = min_lexicographic_sequence(N, K, v) fout.write(" ".join(map(str, min_lex_seq)) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>