3059 - Lexicografic

From Bitnami MediaWiki

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>