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