3059 - Lexicografic

From Bitnami MediaWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Enunt

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

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

Î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

Î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

  • 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

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

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

<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>