Zadanie
Ak máte akékoľvek otázky ohľadom tejto úlohy, napíšte Miškovi na [email protected]
Táto úloha je o dátovej štruktúre - Halda. Ak nevieš čo Halda je, môžeš si o nej viac prečítať v študíjnom texte o Halde.
V Krtkove1 majú teraz nový problém. Je viac ľudí, ktorí sa chcú dať zaočkovať ako vakcín. Rozhodli sa preto, že spravia čakáreň, do ktorej sa môžu ľudia zapísať a počkať, kým pre nich bude k dispozícii vakcína. Ostáva už len jeden problém a to koho zavolať na očkovanie ako prvého. Keďže všetci v Krtkove sú zaneprázdnení, potrebujú niekoho kto im naprogramuje čakáreň.
Úloha
Vašou úlohou bude simulovať čakáreň. Čakáreň pozostáva z dvoch typov akcií. Buď sa niekto s celočíselnou prioritou2 \(p\) prihlási do čakárne alebo máme novú vakcínu, teda človek s najväčšou prioritou bude zaočkovaný a odíde z čakárne. Po každej akcii nás zaujíma, aká je najväčšia priorita medzi ľuďmi v čakárni. Na začiatku je čakáreň prázdna.
Formát vstupu
Na prvom riadku sa nachádza číslo \(n\) - počet akcií ktoré treba spracovať. Nasleduje \(n\) riadkov, \(i\)-ty z nich popisuje \(i\)-tu akciu a má tvar \(t\ x\). Ak \(t\) je \(0\), tak prišla nová vakcína a \(x\) ignorujeme. Ak \(t\) je \(1\), tak sa do čakárne prihlásil nový človek s prioritou \(x\). V prvej akcii sme ponechali na vstupe \(x\) kvôli ľahšiemu načítavaniu vstupu (pre obe akcie treba načítať dve čísla).
Je zaručené, že ak prišla nová vakcína v čakárni je aspoň jeden človek. Vo všetkých sadách platí, že \(1 \leq n \leq 2 \cdot 10^5\) a \(1 \leq x \leq 10^9\).
Formát výstupu
Vypíšte \(n\) riadkov, v \(i\)-tom jedno celé číslo - najväčšia priorita spomedzi ľudí v čakárni po \(i\) akciách. Ak je po \(i\)-tej akcii čakáreň prázdna, vypíšte namiesto toho prazdna
.
Príklad
Input:
10
1 1
1 1
0 0
1 6
0 0
1 2
0 0
0 0
1 4
0 0
Output:
1
1
1
6
1
2
1
prazdna
4
prazdna
V tejto úlohe nám stačí spraviť obyčajnú maximovú haldu, ktorá bude zvládať dve operácie - push a pop. To ako, prečo, ako rýchlo… halda funguje bolo v študíjnom texte o Halde. Teraz si ukážeme už len implementáciu.
Python:
= []
pole
def push(co):
pole.append(co)= len(pole) - 1
kde while kde > 0:
= (kde - 1) // 2
rodic if pole[kde] > pole[rodic]:
= pole[rodic], pole[kde]
pole[kde], pole[rodic] = rodic
kde else:
break
def pop():
= len(pole)
n 0], pole[n-1] = pole[n-1], pole[0]
pole[
pole.pop()= 0
kde while True:
= kde
kam if 2*kde+1 < n-1 and pole[2*kde+1] > pole[kam]:
= 2*kde+1
kam if 2*kde+2 < n-1 and pole[2*kde+2] > pole[kam]:
= 2*kde+2
kam if kam != kde:
= pole[kam], pole[kde]
pole[kde], pole[kam] = kam
kde else:
break
= int(input())
n
for i in range(n):
= map(int, input().split())
t, x if t == 0:
pop()if len(pole) == 0:
print('prazdna')
else:
print(pole[0])
if t == 1:
push(x)print(pole[0])
C++:
#include <iostream>
#include <vector>
using namespace std;
void push(int co, vector<int> &p)
{
.push_back(co);
pint kde = p.size() - 1;
while (kde > 0)
{
int rodic = (kde-1)/2;
if (p[kde] > p[rodic])
{
( p[kde], p[rodic] );
swap= rodic;
kde } else break;
}
}
void pop(vector<int> &p)
{
int n = p.size();
( p[0], p[n-1] );
swap.pop_back();
pint kde = 0;
while (true)
{
int kam = kde;
if (2*kde+1 < n-1 && p[2*kde+1] > p[kam]) kam = 2*kde+1;
if (2*kde+2 < n-1 && p[2*kde+2] > p[kam]) kam = 2*kde+2;
if (kam != kde)
{
( p[kde], p[kam] );
swap= kam;
kde }
else break;
}
}
int main()
{
<int> pole;
vector
int n;
>> n;
cin
for(int i = 0; i < n; i++)
{
int t, x;
>> t >> x;
cin if(t == 0)
{
(pole);
popif(pole.size() == 0)
{
<< "prazdna\n";
cout }
else
{
<< pole[0] << '\n';
cout }
}
if(t == 1)
{
(x, pole);
push<< pole[0] << '\n';
cout }
}
}
Diskusia
Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.
Pre pridávanie komentárov sa musíš prihlásiť.