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