Editorial for Polica


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence.

Da bi raspored dobijen zamenom dve cifre imao najveću moguću lepotu, želimo da prva cifra bude najveća moguća, pa ako iza A_1 postoji neka veća vrednost, zamenićemo je sa onom koja je:

  • najveća, i ako postoji nekoliko istih
  • poslednjom takvom (da bi stavili manju cifru A_1 na mesto sa što manjom "težinom").

Ukoliko ovakva cifra ne postoji, odnosno A_1 je veća ili jednaka od svih vrednosti desno od nje, isti proces probamo za sledeću cifru A_2 (gde kao kandidate za zamenu gledamo samo one desno od A_2), i tako dalje dok ne nađemo par koji se može zameniti.

Ukoliko dođemo do kraja broja i nismo ništa zamenili, cifre u početnom rasporedu su opadajuće, tako da nije moguće povećati lepotu rasporeda. U ovom slučaju nam je cilj da je smanjimo što manje (jer moramo napraviti neku zamenu). Ukoliko postoje dve iste cifre, zamenićemo njih da bi lepota ostala ista. U suprotnom, optimalno rešenje je da zamenimo poslednje dve cifre.

"Naivno" rešenje zadatka koje za svako A_i prolazi kroz sve cifre desno od nje ima vremensku složenost O(N^2), tako da se neće izvršiti u datom ograničenju za poslednji podzadatak. Da bi izbegli ovaj korak, na početku programa možemo pronaći poslednje pojavljivanje svake cifre i sačuvati to u pomoćnom nizu, što se može iskoristiti da za svako A_i nađemo optimalnu zamenu u konstantnom vremenu, i samim tim daje ukupnu vremensku složenost O(N).


Comments

There are no comments at the moment.