Спец задатак
Аутор: Душан Здравковић
Текст и тест примери: Душан Здравковић
Анализа решења: Слободан Митровић
Тестер: Александар Златески
Анализа
Најпре, приметимо да је спец вредност подниза нула (што је и најмања могућа) ако тај подниз садржи нулу. Ово такође важи без обзира коју трансформацију применимо на низ. Тако да ћемо улазни низ поделити на максималне поднизове који не садрже 0. Сваки такав подниз ћемо звати не-нула.
Нека је A' један не-нула подниз. Прво ћемо за свако X које постоји у A' направити низ A_X = (i_1, i_2, \ldots, i_{n_X}), где је i_k индекс k-тог појављивања броја X у A', а n_X је број појављивања X у A'. Ове низове ћемо чувати у C++ map структури или сортиране по X тако да за дато X одговарајући низ можемо наћи у O(\log N) времену, нпр, бинарном претрагом ако низове чувамо сортиране по X. На исти начин ћемо обрадити све не-нула поднизове. Дакле, C++ map структура ће за дато X чувати више различитих A_X, највише једно A_X за дати не-нула подниз.
Решење за дато A_X
Најпре, ако је X = 1 или ако X не постоји у улазном низу, тада је решење тривијално – требало би исписати ``најлевљи’’ подниз дужине 1 који садржи не-нула вредност. Дакле, претпоставимо да X \ge 2 и нека је B_X неки подниз за X са највећом спец вредношћу. Нека K означава број појављивања X, а P дужину одговарајућег подниза. Лако је запазити да спец вредност подниза расте врло брзо, тј., експоненцијално, са повећањем K док расте линеарно са повећањем P. Врло корисна последица овог запажања је да B_X може да изостави највише \lfloor \log_X N \rfloor појављивања броја X – у супротном би цео одговарајући не-нула подниз А' имао строго већу спец вредност него B_X.
Ова запажања сада лако воде до решења: за дато X посматрајмо све поднизове од A_X од индекса L до индекса R (индекси крећу од 1) тако да L \le R и (L - 1) + (|A_X| - R) \le \lfloor \log_X N \rfloor; најбољи од тих поднизова је решење за A_X. За дато X, има највише (\lfloor \log_X N \rfloor + 1) \cdot (2 + \lfloor \log_X N \rfloor) / 2 таквих индекса L и R.
Решење за дато X међу свим не-нула поднизовима
За свако A_X ћемо наћи његов најбољи подниз R_X, где итерирамо по A_X из сваког не-нула подниза. Међу свим R_X ћемо исписати онај који имај највећу спец вредност; детаљи како да нађемо такав подниз су дати у наставку.
Смернице за алгоритам
За коначан алгоритам су потребна још два детаља.
Прво, кад једном израчунамо решење за X = Q_i, запамтићемо ово решење, на пример, у низу величине 1.000.000. Cледећи пут ако добијемо упит X = Q_j можемо да вратимо решење из тог низа.
Друго, током обраде упита за дато X, итерираћемо међу поднизовима од A_X (као што је описано изнад), и за сваки подниз исписати пар (c, P). У овом случају c представља број појављивања X у датом поднизу од A_X, а P представља дужину тог подниза. Претпоставимо да c_1 \ge c_2 (супротан случај се аналогно решава). Подниз са (c_1, P_1) има већу спец вредност од подниза са (c_2, P_2) акко X^{c_1} / P_1 > X^{c_2} / P_2, што повлачи X^{c_1 - c_2} \cdot P_2 > P_1. По конструкцији имамо c_1 - c_2 \le \lfloor \log_X N \rfloor, што повлачи да X^{c_1 - c_2} \cdot P_2 стаје у тип long long.
Користећи исту идеју за дато X можемо наћи најбољи подниз међу свим не-нула поднизовима. Када имамо више поднизова са истом спец вредношћу, онда бирамо онај који је ``левљи’’, као што је то описано у поставци задатка. Овај део решења се једноставно имплементира.
Процена сложености
За дато X обрада упита захтева време (\lfloor \log_X N \rfloor + 1) \cdot (2 + \lfloor \log_X N \rfloor) / 2 помножено са бројем не-нула поднизова који садрже X (заправо, сложеност је потенцијално мања јер није обавезно да сви поднизови садрже бар \lfloor \log_X N \rfloor појављивања броја X). Имамо (\lfloor \log_X N \rfloor + 1) \cdot (2 + \lfloor \log_X N \rfloor) / 2 \le 210, где се максимум достиже за X = 2. За X > 1000 имамо \lfloor \log_X N \rfloor \le 1, што повлачи да је (\lfloor \log_X N \rfloor + 1) \cdot (2 + \lfloor \log_X N \rfloor) / 2 \le 3 за већину вредности која се може наћи на улазу.
Број свих непразних поднизова A_X, за све вредности X, је највише N. То нам сада даје коначну сложеност од 210 \cdot N која је довољно мала за временско ограничење. Као што је наведено, разматрањем неколико случајева се може показати да се ова сложеност никад не достиже него да је бар неколико пута мања.