Опет XOR
Аутор: Павле Мартиновић
Текст и тест примери: Димитрије Ердељан
Анализа решења: Алекса Милисављевић
Тестирање: Павле Мартиновић
Решење када је Q \leq 10, X[i] \leq 10 за упите типа 2
У овом подзадатку можемо тестирати све могуће пермутације и проверити да ли су XOR-ови свих префикса растући. Сложеност овог решења O(Q\cdot N!).
Решење када је N, Q \leq 200
За овај подзадатак неопходно је да размотримо детаљније када је низ ксортастичан. За почетак, можемо да приметимо додавање елемента са вредношћу 0 на произвољну позицију не утиче на монотоност префиксних XOR-ева, па те елементе можемо да занемаримо. Додатно ћемо, зарад јасније нотације, у објашњењу овог подзадатка претпоставити да је дат само један упит на који треба одговорити. Разматраћемо следеће грамзиво решење: итеративно градимо пермутацију тако да наредни изабрани елемент проузрокује најмањи могући префиксни XOR, и да тај наредни префиксни XOR још увек буде већи од тренутног. Нека је тренутни префиксни XOR једнак x. Означимо са B_i позицију водећег бита броја A_i. Нека је баш A_i наредни одабрани елмент. Да би наредни XOR био већи, у бинарном запису броја x мора да стоји 0 на позицији B_i. Од свих наредних елемента који задовољавају овај услов, довољно је да одаберемо онај који ће што слабију 0 броја x променити у 1. Једна од стратегија која резултује у оваквом начину бирања елемената је управо одабир елемента који ће што мање да повећа префиксни XOR. На интуитивном нивоу, можемо схватити да овим избором што мање већих позиција на којима су 0 мењамо у 1. Ова стратегија ће увек произвести низ растућих префиксних XOR-ева кад год је низ ксортастичан. Претпоставимо да постоји решење у којем на позицији j у пермутацији није одабран елемент којим се најслабија 0 трансформише у 1 и означимо ту позицију на којој је најслабија 0 са p. Посматрајмо у том решењу прву позицију k > j у пермутацији након тренутне на којој се налази елемент A_l, такав да је B_l = p. Тада можемо да модификујемо пермутацију тако што на позицију j поставимо A_l, а све остале елементе померимо за једно место десно. Након тога, потребно је још да разрешимо проблеме који су могли настати са елементима A_m који су у пермутацији били између j и k и таквим да B_m < p. Након овог техничког детаља којег остављамо читаоцу, добија се пермутација која има неопадајући низ префиксних XOR-ева, а елемент A_l на позицији j. Сложеност овог решења је O(Q\cdot N^2).
Решење када N, Q \leq 5000
У претходном подзадатку смо приметили да је довољно одабрати елемент који што слабију 0 тренутног префиксног XOR-а трансформише у 1. Довољно је да елементе чувамо према њиховом најјачем биту и да итерацијом кроз све позиције на којима су 0 (почевши од најслабије) у бинарном запису тренутног префиксног XOR-а одаберемо произвољан елемент који има 1 као најјачи бит на тој позицији. Сложеност овог решења је O(Q\cdot N \cdot \log_2 \max_i A_i).
Решење када A[i] < 64.
Приметимо да су у овом случају и префиксни XOR-еви до 64. Уколико низ из упита има више од 64 позитивне вредност, одговор је false
. У супротном можемо да применимо решење из претходног описаног подзадатка. Сложеност овог решења је O(Q\cdot \max_i A_i \cdot \log_2 \max_i A_i).
Решење када T[i] = 2
За овај подзадатак је неопходно да даље оптимизујемо проверу услова из грамзивог решења. Приметили смо да је било довољно бирати произвољан број који има највећи бит постављен на позицији што слабије 0 из тренутног префиксног XOR-а. Сада је потребно да видимо када ћемо успети да одаберемо све такве бројеве. Одабиром тог броја се 0 на тој позицији променила у 1 у наредним префиксним XOR-евима. Да би опет одабрали број који има 1 на тој позицији, потребно је да се поново у префиксном XOR-у нађе 0. Дакле, за свако (осим последњег) постављање тог бита на 1 у актуелном префиксном XOR-у, потребно је да га касније ресетујемо, постављањем на 0. Означимо са p_i број елемената у којима је бит на позицији i најјачи, а са q_i број елемената у којима је тај бит постављен, али не као најјачи. Потребан и довољан услов је да q_i \geq p_i + 1. Вредности p_i и q_i у неком поднизу можемо пронаћи коришћењем префиксних сума. Сложеност овог решења је O(Q \cdot \log_2 \max_i A_i).
Главно решење
За главно решење би било неопходно и да вршимо ажурирање тих префиксних сума. Ово захтева да користимо фенвиково стабло (тј. bit
). У фенвиковом стаблу за свако i памтимо и ажурирамо колико елемената у одговарајућем интервалу има 1 као најјачи бит на позицији i, а колико њих има 1, али не као најјачи бит. Сложеност овог решења је O(Q \cdot \log_2 \max_i A_i \cdot \log_2 N).