Professional Documents
Culture Documents
Rjesenja PDF
Rjesenja PDF
Opisi algoritama
Zadatak Klizanje Autor: Marija Gegić
Najprije je potrebno uočiti da Mirko raspolaže s ukupno N+M karata, a na klizanje će doći
ukupno A+B ljudi. U slučaju kad na klizanje dođe više ljudi nego što Mirko ima karata, on će
prodati sve karte koje ima. U slučaju kad na klizanje dođe manje ljudi nego što Mirko ima
karata, on će svakoj osobi koja je došla prodati jednu kartu, pa će ukupan broj prodanih
karata biti jednak broju osoba koje su došle na klizanje. Dakle, traženo rješenje je manji od
brojeva (N+M) i (A+B).
Kada ćemo zaključiti da nema rješenja? Primijetite da se ostatci pri dijeljenju sa D periodički
ponavljaju s periodom D (a možda i manjim). To znači da je ostatak za X = 1 jednak ostatku
za X = D + 1, ostatak za X = 2 jednak ostatku za X = D + 2 i tako dalje. Iz toga slijedi da, ako
se zadani ostatak O nije pojavio za X = 1, 2, …, D, tada se uopće neće pojaviti pa u tom
slučaju nema rješenja.
Potrebna znanja: učitavanje podataka, naredba odlučivanja, for petlja, određivanje većeg
od dva broja
Kategorija: ad-hoc
Zbog veličine niza potrebno je efikasno sortirati, u složenosti O(N log N), te efikasno računati
zbroj prefiksa, što je najjednostavnije učiniti tako da zbroj K-prefiksa računamo dodajući K-ti
element na prethodno izračunati zbroj (K-1)-prefiksa.
Dovoljno je promatrati samo desnu polovinu slike i na kraju rezultat udvostručiti. Rješenje je
zbrojiti visine X-stupaca za X = 1, 2, …, 10^7, što možemo učiniti for petljom.
Kako odrediti visinu stupca na koordinati X? Ona je veća ili jednaka visini stupca na
koordinati X + 1. Veća je ako postoji pravokutnik koji završava na koordinati X i viši je od
stupca na koordinati X + 1, a inače je jednaka. Zato na početku treba zapisati na kojiim
X-koordinatama završavaju dani pravokutnici i koje su visine, te prolaziti X-stupce “unatrag”,
prema ishodištu, da bismo mogli primijeniti formulu iz prethodne rečenice.
Za bilo koju liniju A-B zaključujemo: svakim Krumpovim odabirom grada A ili grada B mijenja
se njezino postojanje, pa njezino konačno postojanje ovisi samo o parnosti broja odabira
gradova A i B. Budući da su, dakle, važne samo parnosti broja odabira pojedinih gradova,
dovoljno je pretpostaviti da Krump svaki grad bira nula ili jedan put (odabir ili ne-odabir), što
bitno pojednostavljuje zadatak.
Promatramo dvije mogućnosti: Krump odabire ili ne odabire grad 1. Za svaku od ovih
mogućnosti provjerit ćemo može li dovesti do potpunosti grafa. Ako smo fiksirali odabir (ili
ne-odabir) grada 1, za bilo koji drugi grad K možemo lako zaključiti mora li biti odabran s
obzirom na parnost koja mora omogućiti postojanje linije 1-K. Na taj način određujemo
odabire ili ne-odabire svih gradova od 2 do N. Budući da smo ovako osigurali samo
postojanja linija 1-K, provjerit ćemo postojanja svih ostalih linija i ako one sve postoje,
imamo odgovor DA.
Alternativno je rješenje sljedeće: odgovor je DA ako i samo ako se početni graf sastoji od
točno dvije komponente od kojih je svaka potpuni graf (klika). Dokaz ostavljamo čitateljima
za vježbu.
Zadatak ćemo rješavati offline metodom, gdje ćemo prvo učitati sve upite, a zatim ih
obrađivati. Za početak, definirajmo dvije funkcije, left(x), right(x) koje odgovaraju poziciji
prvog lijevog, tj. prvog desnog elementa iste vrijednosti onom na poziciji x. Te dvije funkcije
nije teško izračunati krećući se s lijeva na desno, odnosno s desna na lijevo prateći ‘zadnje’
svake vrijednosti koristeći hash mapu, strukturu Map u C++-u ili obično polje ukoliko najprije
napravimo sažimanje vrijednosti. Promatrajmo neki upit [L, R] i funkcije left(x), right(x). Nije
teško za primijetiti da ćemo neku poziciju x ubrojati u upit [L, R] ukoliko je left(x) < L <= x <=
right(x) <= R < right(right(x). Prirodnim jezikom: želimo da se prvo lijevo pojavljivanje
vrijednosti nalazi prije lijevog kraja intervala, a prvo desno pojavljivanje prije ili na desnom
kraju intervala uz to da ne postoji još jedno pojavljivanje vrijednosti u intervalu. Time
osiguravamo prebrojavanje svakog para dvije iste vrijednosti točno jednom. Time svodimo
zadatak na sljedeći problem: za neki x povećaj za jedan rješenje svakog upita gdje je left(x)
< L <= x i gdje je right(x) <= R < right(right(x)).
Kako bismo izveli ovaj upit potrebno je konstruirati tournament strukturu podataka nad svim
intervalima na sljedeći način: za svaki čvor tournamenta koji pokriva interval [A, B] potrebno
je ‘ubaciti’ upit [L, R], ako je A <= L <= R, tj. L e [A, B]. Nakon ovog, potrebno je za svaki x,
ubaciti interval [right(x), right(right(x))> u sve čvorove stabla od kojih je interval <left(x), x]
sačinjen (klasična query ili update operacija nad tournametnom). Takvih čvorova ima O(lg N)
za svaki x. Nakon ubacivanja upita i intervala u tournament, potrebno je za svaki čvor stabla
izračunati ‘prinos’ upitima koji se nalaze u tom čvoru, taj dio odrađujemo sweep tehnikom i
ostavljamo čitatelju detalje implementacije kao vježbu.
Ukupna složenost priloženog rješenja je O(N lg2 N). Također postoji i rješenje složenosti O(N
lg N), koje također ostavljamo čitatelju za vježbu.
Svaki put od prvog stupca do zadnjeg stupca zapravo je put od nekog čvora u nekom stablu
do korijena istog tog stabla. Nazovimo čvorove u prvom stupcu “posebnima”. Sada je
zadatak zapravo bojanje točno K čvorova stabla tako da na svakom putu od posebnog čvora
do korijena bude točno jedan obojan čvor.
Primjenimo jedan trik, dodajmo u graf jedan pomoćni čvor i dodajmo brid iz svakog korijena
u taj pomoćni čvor. Sada imamo točno 1 stablo u grafu i za njega rješenje provjeravamo
dinamičkim programiranjem.
Računamo vrijednost funkcije f(x, i, k) koja nam vraća možemo li obojati sva podstabla čvora
x od njegovog i-tog djeteta nadalje. Ključni dio je određivanje koliko ćemo čvorova bojati u
i-tom podstablu. Ako bojamo točno y čvorova onda rješenje postoji ako su vrijednosti obje
f(x, i + 1, k - y) i f(dijete[x][i], 0, y) jednake 1.
Na kraju, pazimo da u komponentama koje vode u cikluse možemo čvorove bojati
proizvoljno.
Ako iteriramo po svim mogućim y složenost algoritma je O(NMK2).