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