Diferente pentru problema/infasuratoare intre reviziile #6 si #7

Nu exista diferente intre titluri.

Diferente intre continut:

* $-1.000.000.000 ≤ X{~i~},Y{~i~} ≤ 1.000.000.000$
* Pentru $20%$ din teste $N ≤ 20$
* Pentru inca $60%$ din teste $N ≤ 110.000$.
* Pentru inca $60%$ din teste $N ≤ 120.000$.
* Pentru ultimele $20%$ din teste $N ≤ 1.000.000$ si punctele vor fi sortate dupa $X$ si in caz de egalitate dupa $Y$.
* De asemenea pentru primele $50%$ din teste punctele sunt generate random, astfel incat numarul de puncte de pe infasuratoarea convexa va fi mic.
Pentru usurinta intelegerii rezolvarii se face urmatoarea notatie: notam $H$ ca fiind numarul de varfuri ale infasuratorii convexe.
O prima observatie esentiala este ca varfurile acestui poligon sunt puncte din acele $N$ puncte date initial.
Cu aceasta observatie se poate implementa urmatorul algoritm naiv si usor de implementat. Se incepe cu un punct care se afla sigur pe infasuratoare, sa presupun ca il alegem pe cel mai din stang. Dupa ce s-a ales acest punct se incearca toate punctele si se alege punctul care face o intoarcere cat mai puternica spre stanga cu punctul curent, aceasta se face in {$O(N)$}. Acest punct la randul lui se afla pe infasuratoare deoarece nu exista nici un alt punct care unit cu primul sa il acopere. Se continua algoritmul cu punctul tocmai ales. Aceasta solutie face $O(N)$ pasi pentru fiecare punct de pe infasuratoare convexa, deci complexitatea finala ar fi $O(N*H)$. In caz general, pentru teste generate random aceasta solutie face un numar mic de pasi, dar pentru teste generate inteligent poate face aproximativ $O(N^2^)$ pasi. Aceast algoritm se numeste "Jarvis March":http://www.cs.princeton.edu/~ah/alg_anim/version1/JarvisMarch.html. O sursa se poate vedea aici.
O alta solutie se poate
O alta solutie se bazeaza pe sortarea dupa unghi. Se alege un punct care sa fie sigur pe infasuratoare, sa presupunem ca e cel mai de jos punct. Se sorteaza toate punctele in functie de panta dreptei care uneste punctul ales de restul punctelor. Dupa care se construieste o stiva care tine in fiecare moment infasuratoare convexa curenta. Un punct cand este introdus in stiva va scoate puncte pana cand acesta formeaza cu dreapta definita de ultimele $2$ puncte din stiva un unghi mai mic de $180$ grade, si astfel se tot inchide poligonul. Acest algoritm se numeste "Graham Scan":http://www.cs.princeton.edu/~ah/alg_anim/version1/GrahamScan.html. Complexitatea sortarii este $O(Nlog{~2~}N) iar complexitatea stivei este de $O(N)$, complexitatea totala fiind de $O(NlogN + N)$.
Aceasta este complexitatea teoretica optima pe caz general.
O alta solutie care are complexitate tot $O(Nlog{~2~}N)$, dar care se poate imbunatati, este compusa din urmatorii pasi:
* Se sorteaza punctele dupa x iar in caz de egalitate dupa y
* Se alege cel mai de jos punct si cel mai de sus punct si se desparte in 2 subprobleme. Pe fiecare parte a dreptei trebuie sa fie gasita infasuratoarea. Aceasta se realizeaza cu o stiva foarte asemanatoare cu cea prezentata anterior. Cat timp pe ambele parti ale dreptei este respectata convexitatea si ambele parti incep si se termina cu punctele alese(cel mai de jos si cel mai de sus) si , din cauza stivei, cuprind toate punctele, reuninuea lor va reprezenta infasuratoarea convexa.
O astfel de solutie este compusa din 2 pasi unul, sortarea, avand complexitate generala $O(Nlog{~2~}N)$, si dupa 2 stive ambele cu complexitate $O(N)$. O optimizare care se poate aduce deobicei la algoritmul acesta in timp de concurs este ori ca punctele sunt direct sortate, cum este cazul de fata, sau ca punctele au coordonate intregi , moment in care se poate apela la o sortare care se bazeaza pe limitarea capacitatii calculatorului de a tine minte numere intregi foarte mari gen "Radix Sort":http://en.wikipedia.org/wiki/Radix_sort sau cateodata "Counting Sort":http://en.wikipedia.org/wiki/Counting_sort.
 
== include(page="template/taskfooter" task_id="infasuratoare") ==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.