Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-03-11 21:03:33.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:sortare.in, sortare.outSursăpreONI 2008, Runda finala
AutorMircea Bogdan PasoiAdăugată dedominoMircea Pasoi domino
Timp execuţie pe test0.1 secLimită de memorie8192 kbytes
Scorul tăuN/ADificultatenormalnormalnormalnormalnormal

Vezi solutiile trimise | Statistici

Sortare

Sortarea rapida (sau QuickSort) este un bine cunoscut algoritm de sortare. Algortimul functioneaza astfel:

  • Se alege un element din sir, care se va numit pivot
  • Se reordoneaza sirul astfel incat toate elementele care detin o valoare mai mica decat valoarea elementului pivot se vor pozitiona inaintea elementului pivot, si elementele care au o valoare mai mare decat valoarea elementului pivot se vor pozitiona dupa elementul pivot
  • Se sorteaza recursiv cele doua bucati din sir

Cazul de baza a unei recursivitati sunt listele de dimensiune 0 sau 1. Putem implementa in pseudocod acest algoritm astfel:

function qsort(sir[])
   var stanga[], dreapta[], pivot
   if lungime(sir) <= 1
       return sir
   pivot = un element din sir
   for each x in sir
       if x < pivot then insereaza x in stanga
       if x > pivot then insereaza x in dreapta
   return concatenaeza(qsort(stanga), pivot, qsort(dreapta))

Fumeanu a implementat acest algoritm si considera ca implementarea lui este foarte eficienta. Nargy este mai intelept si isi da seama ca performanta intregului algoritm depinde de modul in care se selecteaza pivotul. Metoda folosita de Fumeanu este urmatoarea: pentru un sir de lungime i el alege mediana elementelor de pe pozitiile Ai, Bi si Ci (mediana reprezinta elementul mijlociu ca marime dintre cele 3).
Ajutati-l pe Nargy sa gaseasca o permutare a numerelor de la 1 la N pentru care implementarea lui Fumeanu are adancimea recursivitatii maxima.

Date de intrare

Fisierul de intrare sortare.in contine pe prima linie numarul N. Pe urmatoarele N-1 linii se vor gasi cate 3 numere natural Ai Bi Ci separate prin spatii (2≤i≤N).

Date de iesire

In fisierul de iesire sortare.out se va scrie pe prima linie HMax reprezentand adancimea maxima a recursivitatii. Pe urmatoarea linie se vor scrie N numere naturale reprezentand o permutare a numerelor de la 1 la N pentru care se obtine aceasta adancime.

Restrictii

  • 1 ≤ N ≤ 5.000
  • 1 ≤ Ai,Bi,Ci ≤ i
  • Pozitiile din sir sunt numerotate incepand cu 1
  • Daca exista mai multe solutii se poate afisa oricare

Exemplu

sortare.insortare.out
5
1 2 2
1 2 3
1 3 4
1 3 5
3
1 2 3 4 5

Explicatie

Pentru permutarea 1 2 3 4 5 recursivitatea are 3 nivele, astfel:

Elementele ingrosate sunt cele care sunt folosite in determinarea pivotului, iar cele subliniate reprezinta pivotul. Nu exista nici o permutare de lungime 5 care sa produca o adancime mai mare pentru datele de intrare date.

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?