Editorial for Bojenje
Submitting an official solution before solving the problem yourself is a bannable offence.
Analiza
Dokazaćemo da optimalno rešenje sigurno ima sledeći oblik: broj belih
polja u koloni opada do neke tačke, a zatim raste do kraja, ili raste
do neke tačke pa opada do kraja. Ovo znači da, ako sortiramo redove po
poziciji gde im se menja boja, prvih redova bojimo belo-crno, a
ostale crno-belo.
Da bi dokaz bio jednostavniji, umesto da biramo boje za redove,
biraćemo funkciju , gde je
broj belih polja u koloni između
"promena"
i
. Za validna bojenja zida važe sledeće osobine
, i obrnuto, ako osobine važe možemo napraviti bojenje:
(svi redovi promene boju)
- Za svako
,
(svaki put se menja tačno jedan red)
Dokaz ovoga ostavljamo čitaocu.
Prvo, sigurno postoji tačno jedan "trenutak" (deo zida između dve
promene) kada imamo po crnih i belih polja (za neparno
, sličnim argumentom dokazujemo da se tačno jednom broj menja sa
"više belih" na "više crnih"), tj. postoji tačno jedno
za koje
. Kada ovo ne bi bilo tačno, mogli bismo da
poboljšamo rešenje:
- Nađemo
takvo da je
i
(ili slično za
) -- ako ne postoji, možemo odabrati neki interval između dve tačke gde
i "obrnuti" ih (postaviti
) tako da se ne promeni vrednost rešenja.
- Postavimo
.
Bez gubitka opštosti pretpostavićemo da (počinjemo
sa manje belih nego crnih polja). Na sličan način možemo dokazati da na
intervalu od
to tačke gde imamo isti broj crnih i belih polja
funkcija
opada do neke tačke pa raste, a od te tačke raste pa
opada.
Dakle, optimalno mora imati oblik "opada, pa raste, pa
opada". Sada ćemo dokazati da ne možemo imati oba opadajuća dela: ako
postoje, možemo smanjiti
za
i povećati
za
i
dobiti bolje rešenje.
Sada smo dokazali da je optimalno rešenje ili da broj belih polja raste
do neke tačke pa opada do kraja, ili obrnuto. Kako za svaki izbor
broja belih polja na početku postoji tačno jedna tačka gde možemo preći
sa rastućeg na opadajuće, ili sa opadajućeg na rastuće (kada su sva
polja iste boje), imamo opcija koje treba proveriti.
Sada još ostaje da nađemo način da izračunamo koliko bojenje vredi, ako
je dat broj belih polja na početku, i znamo da taj broj opada prvih
kolona a zatim raste do
.
Smernice za algoritam
Izračunaćemo samo vrednost bojenja od početka do kolone . Od te
kolone do kraja metod je identičan.
Vrednost koju treba izračunati je:
Da bismo ovo računali u konstantnom vremenu, na početku programa je
dovoljno da izračunamo nizove prefiksnih suma koje nam daju ove dve
"male" sume za svako .
Comments