Editorial for Premestanja
Submitting an official solution before solving the problem yourself is a bannable offence.
Analiza
Označimo sa redni broj učenika koji sedi za računarom
. Na početku je
za svako
. U svakom premeštanju mi praktično menjamo mesta dva elementa niza
i nakon svakog premeštanja želimo da proverimo da li postoji neki indeks
za koji važi
.
Pomenutu proveru možemo uraditi pravolinijski: u svakom od koraka zamenimo dva elementa niza a zatim prođemo kroz ceo niz i uporedimo
i
. Složenost ovog algoritma je
i rešava podzadatak 1 (
-
poena) ali je previše spor za ostale podzadatke.
Primetimo da kada vršimo proveru nakon premeštanja, za sve indekse
koji nisu učestvovali u prvih
premeštanja važi
; dakle, ne moramo proveravati ceo niz već (u
-tom koraku) samo indekse iz prvih
premeštanja (
; među njima može biti istih). Ovo daje algoritam složenosti
što je dovoljno za prva dva podzadatka (
-
poena).
U trećem podzadatku važi . Međutim, jedini indeksi
za koje je moguće da važi
su
i
(ostali se ne mogu dovoljno "udaljiti"; proveriti!) pa je nakon svake zamene dovoljno proveriti vrednosti
i
što nam daje ukupnu složenost
i rešava ovaj podzadatak (
poena).
Da bismo rešili ceo zadatak, primetimo da nije neophodno stalno proveravati puno indeksa već je dovoljno da u svakom trenutku pamtimo koliko ima indeksa za koje važi
; označimo tu količinu sa
(na početku je
). Pomenuti indeks postoji akko je
. Zamenom dva elementa niza vrednost
se može promeniti najviše za
i razlikovanjem nekoliko slučajeva lako "update"-ujemo
(npr. ako je
i
, a
i
, tada se nakon
-tog premeštanja
povećava za
, itd.) . Složenost ovog rešenja je
i osvaja svih
poena.
Comments