Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-12-21 17:08:51.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:algsort.in, algsort.outSursăArhiva educationala
AutorArhiva EducationalaAdăugată deamadaeusLucian Boca amadaeus
Timp execuţie pe test0.45 secLimită de memorie12288 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Sortare prin comparare

Se dau N numere naturale, intr-o ordine oarecare. Se pune problema sortarii lor in ordine crescatoare.

Date de intrare

Fisierul de intrare algsort.in va avea pe prima linie numarul N, iar pe a doua linie N numere naturale, separate prin cate un spatiu.

Date de iesire

In fisierul algsort.out veti tipari restul impartirii sumei S=\sum_{i=1}^N {i \cdot v[i]} la numarul 123457, unde v[] este vectorul celor N numere sortate in ordine crescatoare (si indexate incepand cu pozitia 1). Pentru detalii despre calculul acestei sume, consultati sectiunea Observatii.

Restrictii

  • 1 ≤ N ≤ 500 000
  • Toate cele N numere se vor fi cuprinse intre 0 si 231-1 inclusiv.

Exemplu

algsort.inalgsort.out
5
4 7 5 1 3
74

Explicatie

Dupa sortare, vectorul v devine:

i12345
v[i]13457

Astfel, S=1 \cdot 1 + 2 \cdot 3 + 3 \cdot 4 + 4 \cdot 5 + 5 \cdot 7=74, iar restul impartirii acestui numar la 123457 este tot 74.

Observatii

Problema sortarii eficiente a datelor impune, in conditiile de fata, cateva particularitati de evaluare pe care le vom descrie in continuare si care au fost pe care le vom descrie in continuare:

Citirea datelor

Limita de timp impusa este de 500 ms, din care, pentru testele maxime, intre 150 si 300 ms vor fi ocupate de citirea datelor. Nu este necesara folosirea functiilor specializate de citire a blocurilor de caractere (parsarea citirii) pentru a obtine punctajul maxim, insa recomandam folosirea stream-urilor C++, care se comporta mai bine in mediul de evaluare decat functiile standard.

Scrierea rezultatelor

Fisierul de iesire nu va contine toate numerele afisate in ordine crescatoare deoarece dimensiunea lui ar creste foarte mult si, odata cu aceasta, si timpul de executie al programului. Astfel, cea mai mare parte a timpului alocat ar fi ocupata de scrierea informatiilor in fisier, si nu de algoritm in sine. Din acest motiv, dupa ce vectorul de numere (il vom nota cu v) va fi sortat, va trebui calculata si tiparita suma S conform cerintei. Valoarea acestei sume poate fi foarte mare, iesind din tipurile standard de date, iar pentru calculul ei ne vom folosi de faptul ca nu avem nevoie decat de restul impartirii ei la numarul 123457:

S <- 0
pentru i <- 1, N
	S <- (S + i*v[i]) mod 123457
sfarsit pentru

Singurul detaliu la care trebuie sa mai avem grija este faptul ca rezultatul inmultirii i*v[i] poate depasi tipul de date in care se incadreaza factorii ei (intreg cu semn pe 32 de biti). De aceea, fie va trebui sa facem o conversie explicita catre un tip intreg pe 64 de biti ($long long$ sau int64), fie ne vom folosi de particularitatile de limbaj sau de compilator, declarand unul dintre factorii produsului ca intreg pe 64 de biti.

Structura testelor

Datorita largii varietati de algoritmi de sortare si comportarii lor diferite in functie de anumite particularitati structurale ale datelor de intrare, pentru evaluarea problemei se folosesc 5 grupe de cate 4 teste. Toate testele aflate in aceeasi grupa vor avea aceeasi valoare pentru N si acelasi domeniu de valori pentru cele N numere: 0 \le v[i] \le \lfloor N \cdot \gamma \rfloor, unde \gamma = \frac{2^{31}-1}{500000}. Testele din cadrul fiecarei grupe se vor diferentia astfel:

  • primul test va contine numere generate aleator
  • al doilea test va contine numere "aproape sortate" (numarul de inversiuni din lista de numere este mic)
  • al treilea test va contine numerele sortate in ordine descrescatoare
  • al patrulea test va contine numerele in ordine aleatoare, insa vor exista putine perechi de numere distincte (foarte multe dintre numere vor aparea de mai multe ori in fisierul de intrare)
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?