Problema predecesor,Campion 2009
.campion, algoritmica, informatica, OJI, ONI, predecesor, Probleme algoritmica
Considerăm un şir de N numere naturale distincte a1, a2, …, aN. Pentru fiecare termen ai definim predecesorul său, dacă există, ca fiind cel mai din dreapta termen aj, cu j < i şi aj < ai. De exemplu, pentru şirul 8, 12, 2, 4, 3, 10, 9, 7, 5, 6, numărul 8 este predecesorul lui 12, 3 este predecesorul lui 5, 10 nu este predecesorul niciunui număr, la fel 4 nu este predecesor pentru alt număr, 2 nu are predecesor.
Cerinţă
Scrieţi un program care determină câte numere din şir nu sunt predecesori ai niciunui alt număr.
Date de intrare
Fişierul de intrare predecesor.in conţine pe prima linie numărul natural N reprezentând numărul de termeni ai şirului. Pe următoarea linie se găsesc, separaţi prin câte un spaţiu, termenii a1, a2, …, aN ai şirului.
Date de ieşire
Fişierul de ieşire predecesor.out va conţine o singura linie pe care va fi scris un singur număr natural reprezentând numărul de termeni ai şirului care nu sunt predecesori ai niciunui alt număr.
Restricţii
- 3 < = N <= 500 000
- 1 < = ai <= 1 000 000 000, pentru orice 1 <= i <= N
Exemplu
| predecesor.in | predecesor.out |
|
10 |
6 |
Solutie
Trebuie sa privim astfel valorile.Exista vreun v[j] astfel incat v[i]
Practic daca gasim o valoare v[j] > v[i] inseamna ca v[i] este predecesor al lui v[j].Daca vom gasi o valoare v[j] < v[i] inseamna ca de acum v[j] va trebuie comparat cu urmatoarele valori pentru a vedea daca este predecesorul uneia dintre ele.
Descarcati solutia problemei Predecesor,Campion 2009 – runda 4





Nou pe 


Comentarii la "Problema predecesor,Campion 2009"
Solutia prezentata de tine ia 100 de puncte? Intreb asta pentru ca daca am vazut bine, tu ai complexitatea O(N^2), iar dupa dimensiunea datelor de intrare nu ar trebui sa ia maxim
Ia 100 de puncte pentru ca solutia e defapt O(n) PUR.
Exprimarea mea atunci nu a fost corecta atunci, nu mi-am dat seama ca defapt ideea mea se bazeaza doar pe urmatorul pas si nu pe toti pana la capat.
Acel while inaintaza doar un pas daca te uiti cu atentie.
While-ul intern s-ar traduce astfel:
if(v[i+1]>v[i]) { if(u[i]) u[i]=0,t--; break; } else if(v[i+1]
Am uitat sa fac aceasta schimbare dupa ce am publicat solutia.