Editorial for Prodavnice
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Analiza
Jasno je da je za svaki upit potrebno izračunati vrednost izraza tj. sumu rastojanja do najbliže prodavnice. Direktno računanje ove sume za svaki upit daje rešenje složenosti što je dovoljno samo za 20 poena.
Posmatrajmo slučaj kada uvek važi tj. kada je potrebno izračunati . Za početak, prirodan korak je sortiranje niza -- nadalje pretpostavljamo da je . Za datu vrednost možemo binarnom pretragom u složenosti odrediti najveću vrednost za koju važi (ili ustanoviti da takva vrednost ne postoji ako je ). Sada važi \sum_{i=1}^n |x_i - A| = \sum_{i = 1}^{ind} (A - x_i) + \sum_{i=ind+1}^n (x_i - A) = ind \cdot A - s_{ind} + (s_n - s_{ind}) - (n - ind)\cdot A gde je niz prefiksnih suma niza , tj. . Prema tome, ukoliko na početku (pre svih upita) sortiramo niz i izračunamo niz prefiksnih suma, možemo za svaki upit odraditi binarnu pretragu i vratiti rezultat iz prethodne jednačine (bez sumiranja). Složenost ovog pristupa je .
Prethodni algoritam se jednostavno modifikuje i u slučaju kada je . U tom slučaju, za upit (npr. neka je ) binarnom pretragom pronađemo najveću vrednost za koju važi ; to znači da će svi stanovnici sa koordinatama ići u prodavnicu a stanovnici sa koordinatama u prodavnicu . Zatim dva puta primenimo prethodni algoritam, jednom za podniz i vrednost , a drugi put za podniz i vrednost .
Za dodatne podzadatke je takođe predviđen ovaj algoritam ali je za njih dovoljna potencijalno lakša imeplementacija i manja analiza specijalnih slučajeva o kojima treba voditi računa prilikom implementacije rešenja za poena -- npr. kada su vrednosti ili ili levo ili desno od niza (npr. kada svi idu u samo jednu prodavnicu). Ovo se u potpunosti može zaobići pametno dizajniranom funkcijom za pomenutu binarnu pretragu.
Comments