Rezolvare completă PbInfo #1130 Codat

Se consideră un șir de N numere naturale, notate x 1, x 2, x 3,…, x N. Definim pentru orice pereche de indici i, j, 1 ≤ i ≤ j ≤ N, distanța între elementele xi și xj ca fiind egală cu j – i.

Acest șir va fi codificat după următoarele reguli:

  • fiecare element din șir este înlocuit cu indicele celui mai apropiat element din șir (cel față de care distanța este minimă) strict mai mare decât el;
  • dacă pentru un element din șir există două elemente care respectă regula de mai sus, atunci el va fi înlocuit cu indicele mai mare, adică al elementului strict mai mare decât el, aflat în dreapta lui;
  • elementele de valoare maximă din șir vor fi înlocuite cu -1.

Cerinţă

Scrieți un program care codifică un șir de N valori, după regulile descrise.

Date de intrare

Fișierul de intrare codat.in conține:

  • pe prima linie numărul natural N
  • pe următoarea linie N numere naturale nenule, separate prin câte un spaţiu, reprezentând șirul x1, x2, x3,…, xN.

Date de ieșire

Fișierul de ieșire codat.out va conține pe prima linie N numere întregi nenule, separate prin câte un spaţiu, reprezentând șirul codificat.

Restricții și precizări

  • 1 ≤ N ≤ 1.000.000
  • 1 ≤ xi ≤ 2.000.000.000, 1 ≤ i ≤ N

Exemplu

codat.in

7
2 9 3 5 1 1 4 

codat.out

2 -1 4 2 4 7 4

Explicație

x1=2: cel mai apropiat element strict mai mare decât el este x2
x2=9: nu are nici un element mai mare decât el
x3=3: elementele mai mari strict decât el, sunt aflate la distanță egală, deci va fi înlocuit cu indicele mai mare adică 4
x4=5: cel mai apropiat element strict mai mare decât el este x2
x5=1: cel mai apropiat element strict mai mare decât el este x4
x6=1: cel mai apropiat element strict mai mare decât el este x7
x7=4: cel mai apropiat element strict mai mare decât el este x4

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Codat:

#include <fstream>
#define DIM 1000002

using namespace std;

ifstream fin("codat.in");
ofstream fout("codat.out");

int v[DIM], s[DIM], L[DIM], R[DIM], minim, k, n, i, maxim, pminim;

int main() {
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
        if (v[i] > maxim)
            maxim = v[i];
        while (k!=0 && v[i] >= v[s[k]]) {
            k--;
        }
        L[i] = s[k];
        s[++k] = i;
    }

    k = 0;
    s[k] = n+1;
    for (i=n;i>=1;i--) {
        while (k!=0 && v[i] >= v[s[k]]) {
            k--;
        }
        R[i] = s[k];
        s[++k] = i;

    }

    for (i=1;i<=n;i++) {
        if (v[i] == maxim) {
            v[i] = -1;
            continue;
        }

        minim = n+2;
        if (L[i] != 0 && i-L[i]<minim) {
            minim = i-L[i];
            pminim = L[i];
        }
        if (R[i]!=n+1 && R[i]-i <= minim) {
            minim = R[i]-i;
            pminim = R[i];
        }
        v[i] = pminim;
    }

    for(i=1;i<=n;i++)
        fout<<v[i]<<" ";

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1130 Codat

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1130 Codat de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!