Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-12-23 19:43:48.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:heapuri.in, heapuri.outSursăArhiva educationala
AutorArhiva EducationalaAdăugată dedevilkindSavin Tiberiu devilkind
Timp execuţie pe test0.125 secLimită de memorie20480 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Heapuri

Se da o colectie de numere naturale initial vida. Se cere sa se efectueze N operatii asupra acestei multimi, astfel:

  • Operatia de tipul 1: se insereaza elementul x in colectie
  • Operatia de tipul 2: se sterge al x-lea element intrat in colectie in ordine cronologica
  • Operatia de tipul 3: se afiseaza elementului minim din colectie

Date de intrare

Fisierul de intrare heapuri.in va contine pe prima linie numarul N. Pe liniile 2 .. N+1, se va afla descrierea operatiilor care trebuie efectuate. Primul numar, cod, reprezinta tipul operatiei. Daca cod este 1 sau 2, atunci se va mai citi si numarul x, avand semnificatia din enunt.

Date de ieşire

Fisierul de iesire heapuri.out va contine pe cate o linie raspunsul pentru fiecare operatie de tipul 3 din fisierul de intrare in ordinea data.

Restricţii

  • 1 ≤ N ≤ 200 000
  • Elementele colectiei nu vor depasi 1 000 000 000
  • Se garanteaza ca nu se va cere niciodata sa se afle minimul daca colectia este vida
  • Se garanteaza ca nu se vor exista 2 operatii de tipul 2 care sa stearga acelasi element din colectie.

Exemplu

heapuri.inheapuri.out
9
1 4
1 7
1 9
3
1 2
2 1
3
2 4
3
4

Explicatie

Dupa primele 3 operatii vom avea in colectie elementele 4, 7, 9. Astfel raspunsul la operatia de tip 3 este 4.
In continuare vom adauga elementul 2 si vom sterge primul element inserat, adica 4, ramanand cu elementele 2, 7, 9.
Vom sterge apoi al 4-lea element intrat, adica 2, in colectia aflandu-se la sfarsit numai 7 si 9, minimul fiind 7.

Indicatii de rezolvare

Problema se poate rezolva brute-force, tinand numerele intr-un vector si efectuand fiecare operatie fara nici un rafinament. Aceasta solutie are complexitate O(1) pe o operatie de tipul 1 si O(N) pe celelalte. O astfel de abordare nu ar trebui sa ia mai mult de 30 de puncte.

Rezolvarea optima foloseste o structura de date cunoscuta sub numele de heap, care suporta efectuarea operatiilor de tipul 1 si 2 in complexitate timp O(log N) si a operatiilor de tipul 3 in timp constant.

Un heap este un arbore binar, cu proprietatea ca fiecare nod are asociata o cheie, cheie care este mica decat cheile asociate nodurilor din subarborele sau. Astfel, raspunsul la o operatie de tip 3 se va gasi in radacina arborelui.

Pentru a intelege modul in care functioneaza aceasta structura de date va recomandam sa cititi
acest articol, ce contine si cateva desene demonstrative.

Pentru a putea implementa mai usor aceasta structura, se recomanda reprezentarea heap-ului ca un vector. Astfel radacina se va afla pe pozitia 1, iar pentru un nod i, parintele sau se va afla pe pozitia i/2, in timp ce fii lui se vor afla pe pozitiile 2*i si, respectiv, 2*i+1. De asemenea, va fi necesar sa pastram un vector cu pozitia fiecarui nod in heap, pentru a-l putea localiza rapid in cazul unei operatii de stergere.

Aplicatii

Heap-urile sunt niste structuri de date foarte utile, deoarece operatiile descrise mai sus sunt intalnite intr-o multime de situatii. Doua aplicatii clasice ce folosesc aceasta structura de date sunt algoritmul lui Dijkstra si algoritmul lui Prim pentru APM. Pentru a va aprofunda cunostintele legate de aceasta structura de date, va recomandam sa rezolvati urmatoarele probleme:

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?