Quick

Time limit: 0.25s Memory limit: 16MB Input: quick.in Output: quick.out

Cerință

Se consideră următoarea implementare a algoritmului quicksort:

int cnt = 0, v[MAX_N + 1], mai_mici[MAX_N], mai_mari[MAX_N]; // variabile globale

int pivot(int st, int dr) {
	int nr_mai_mici = 0, nr_mai_mari = 0;
    for (int i = st + 1; i <= dr; i++) {
        if (v[i] < v[st])
            mai_mici[++nr_mai_mici] = v[i];
        else
            mai_mari[++nr_mai_mari] = v[i];
        cnt++;
    }

    v[st + nr_mai_mici] = v[st];
    for (int i = 1; i <= nr_mai_mici; i++)
        v[st + i - 1] = mai_mici[i];
    for (int i = 1; i <= nr_mai_mari; i++)
        v[st + nr_mai_mici + i] = mai_mari[i];

    return st + nr_mai_mici;
}

void sorteaza(int st, int dr) {
    if (st < dr) {
        int p = pivot(st, dr);
        sorteaza(st, p-1);
        sorteaza(p+1, dr);
    }
}

Pentru un șir vv cu nn elemente stocate pe poziții de la 11 la nn, facem apelul sorteaza(1,n);, la finalul căruia șirul vv ajunge să fie sortat crescător.

O permutare de nn elemente este un șir de nn valori naturale cuprinse între 11 și nn, distincte două câte două.

Pentru un nn dat, să se determine o permutare de nn elemente, pentru care dacă aplicăm algoritmul de mai sus, valoarea variabilei cntcnt la final este minimă. Dacă există mai multe permutări care satisfac cerința, să se determine permutarea minim lexicografică dintre acestea.

Date de intrare

Fișierul quick.in conține pe prima linie două numere naturale separate prin spațiu, pp și nn.

Date de ieșire

Pentru p=1p=1 fișierul quick.out conține pe prima linie valoarea minimă obținută în variabila cntcnt în urma aplicării algoritmului pentru o permutare de lungime nn.
Pentru p=2p=2 fișierul quick.out conține pe prima linie nn numere naturale distincte, cuprinse între 11 și nn, separate prin spații, reprezentând permutarea minim lexicografică de lungime nn, corespunzătoare valorii minime calculate în variabila cntcnt, la sfârșitul aplicării algoritmului de sortare.

Restricții și precizări

  • 1n100 0001 \leq n \leq 100 \ 000
  • Un şir a1,a2,,ana_1, a_2, \ldots, a_n este mai mic lexicografic decât un alt şir b1,b2,,bnb_1, b_2, \ldots, b_n dacă există un număr întreg ii (1in1 \leq i \leq n) astfel încât: a1=b1a_1 = b_1, a2=b2a_2 = b_2, \ldots, ai1=bi1a_{i–1} = b_{i–1}, iar ai<bia_i < b_i.
  • Pentru teste în valoare de 66 puncte p=1p = 1 și n10n \leq 10;
  • Pentru alte teste în valoare de 99 puncte p=2p = 2 și n10n \leq 10;
  • Pentru alte teste în valoare de 2020 de puncte p=1p = 1 și n5 000n \leq 5 \ 000;
  • Pentru alte teste în valoare de 3030 de puncte p=2p = 2 și n5 000n \leq 5 \ 000;
  • Pentru alte teste în valoare de 1414 puncte p=1p = 1.

Exemplul 1

quick.in

1 4

quick.out

4

Exemplul 2

quick.in

2 4

quick.out

2 1 3 4

Explicație

Pornind de la șirul 2 1 3 4, la apelul sorteaza(1, 4) se fac trei incrementări ale lui cnt. După aceea șirul devine 1 2 3 4. Apoi se mai fac două autoapeluri, sorteaza(1, 1) și sorteaza(3,4). Primul autoapel nu mai efectuează incrementări, iar al doilea efectuează o incrementare, apelând apoi sorteaza(3, 2) si sorteaza(4, 4), care nu mai efectuează alte incrementări. În total avem 44 incrementări.

Similar, pentru șirul 3 2 1 4 se vor efectua tot 44 incrementări: la apelul sorteaza(1, 4) se fac trei incrementări, șirul devine 2 1 3 4, apoi se mai fac două autoapeluri, sorteaza(1, 2) și sorteaza(4,4), ultimul nu mai efectuează incrementări, iar primul efectuează una, șirul devenind 1 2 3 4, apelând mai departe sorteaza(1, 1) si sorteaza(3, 2), care nu mai efectuează alte incrementări. Acest sir (3 2 1 4) nu este o soluție acceptată întrucât nu este mai mic lexicografic decat 2 1 3 4.

Atenție, nu ne interesează momentul în care se sortează șirul ci numărul de incrementări pe care le face algoritmul dat pe permutarea detectată. De exemplu, dacă permutarea obținută era 1 2 3 4 un apel sorteaza(1,4) ar fi făcut trei incrementări, apoi permutarea ar fi rămas aceeași și s-ar fi făcut un autoapel sorteaza(2,4), pentru acesta se mai fac doua incrementări, apoi autoapelul sorteaza(3, 4) care mai face o incrementare, apoi sorteaza(4, 4) care nu mai realizează alte incrementări. Așadar numărul de incrementări ar fi fost 66, chiar dacă șirul dat era deja crescător.

Log in or sign up to be able to send submissions!