Editorial for Vrednost dodele
Submitting an official solution before solving the problem yourself is a bannable offence.
Označimo skup sa
.
Posmatrajmo dodele vrednosti za
i definišimo dve funkcije
, takva da je
, gde je
vrednost na poziciji
u nizu
nakon izvršavanja dodela vrednosti za
a
je ta vrednost pre izvršavanja dodela.
ciklično pomeranje za jedno mesto ulevo.
Sada ćemo operaciju koju treba izvršiti na nizu (za svako
i za svako
) označiti sa
, gde je
. Označimo sa
operaciju na nizu
koja odgovara izvršavanju unutrašnje for-petlje (po
) za dato fiksno
. Jasno je da važi:
. Ključna ideja je to što
možemo zapisati u obliku
. Ovo važi zato što preslikavanjem
"rotiramo" niz u takvu poziciju da element koji je bio na poziciji
je sada na poziciji
. Nakon toga primenjujemo dodelu vrednosti sa
i ponovo rotiramo niz u kontra smeru za
mesta.
Ako zatim proširimo izraz za i skratimo susedne parove
ostaje nam
, odnosno, kraće
, gde smo uveli oznaku
. Kako se
lako računa kao desna rotacija za
mesta, ako uvedemo oznaku
ostaje nam da izračunamo
-ti stepen ove funkcije.
Da bismo za svako pronašli vrednost
konstruišemo graf sa čvorovima
i usmerenim granama
. Kako je usmeren, konačan i iz svakog čvora izlazi tačno jedna grana, komponente povezanosti (posmatrajući graf kao neusmeren) izgledaju kao ciklusi sa stablima čiji je tačno jedan čvor deo ciklusa (primetiti da kako je moguće da
postoji mogućnost da ciklus sadrži samo jedan čvor). Usmerenje grana u ciklusu mora biti takvo da je ciklus i u usmerenom grafu, dok usmerenje grana u stablima mora biti takvo da je ulazni čvor bliži ciklusu od izlaznog.
Obilazeći svaku komponentu povezanosti (posmatrajući graf kao neusmeren) u njoj pronalazimo ciklus za čiji svaki čvor nalazimo kao
gde je
dužina ciklusa koji sadrži čvor
,
daje redni broj čvora
u ciklusu dok
označava
-ti čvor na tom ciklusu. Za "početak" ciklusa možemo izabrati proizvoljan čvor. Zatim _dfs_ obilaskom, kroz stabla povezana sa tim ciklusom, unazad (suprotno usmerenju grana) za svaki čvor
čiji je otac u stablu obilaska
računamo
ili kao prethodnika čvora
u ciklusu ukoliko je
na rastojanju od ciklusa manjem od
ili kao sina čvora
u stablu obilaska u čijem podstablu se nalazi čvor
. Ovog sina možemo naći tako što održavamo niz koji odgovara steku čvorova tokom _dfs_-a i uzimanjem
-tog prethodnika trenutnog čvora.
Na kraju potrebno je samo izračunati traženu vrednost, znajući vrednosti niza nakon svih dodela vrednosti.
- Vremenska složenost algoritma
- Prostorna složenost algoritma
Comments