Најслабија карика
Аутор: Павле Мартиновић
Текст и тест примери: Павле Мартиновић
Анализа решења: Павле Мартиновић
Тестирање: Алекса Милисављевић
Решење када N \leq 10, Q\leq100
Приметимо да сваки низ који добијемо на крају је подсеквенца почетног, па за дати низ постоји највише 2^N могућих подсеквенци и за сваку можемо грамзивим алгоритмом да проверимо да ли се заиста може добити описаним операцијама. O(Q2^NN)
Решење када N,Q \leq 500
За сваки подзадатак надаље ћемо морати да се удубимо у концепт Декартовог стабла низа. Наиме, то је бинарно стабло које се конструише рекурзивно (у квадратном времену) на следећи начин: нека је i индекс максимума у нашем низу, онда је чвор i корен нашег стабла. Затим, поделимо низ на два низа 1,2,\cdots,i-1 i i+1,i+2,\cdots,N и нађемо Декартово стабло од ова два подниза, чијим качањем на корен i као лево и десно дете, редом, ћемо добити Декартово стабло целог низа. Сада може се приметити да је могуће уклонити неки члан низа акко смо већ уклонили цело његово подстабло у Декартовом стаблу. Стога је задатак заправо еквивалентан са тражењем броја начина како можемо да изаберемо неколико дисјунктних подстабала Декартовог стабла датог низа. Ово се решава простим динамичким програмирањем на стаблу. Ако су l и r деца чвора u, онда можемо да срачунамо dp[u]=dp[l]\cdot dp[r]+1. O(QN^2)
Решење када N,Q \leq 500
Овај подзадатак се ради слично као и претходни, само је потребно да се брже изгради Декартово стабло. Ово може да се уради, на пример, тако што се за сваки елемент низа нађе први елемент лево и десно већи од њега (преко такозване “стек форе”), и онда је његов родитељ у Декартовом стаблу управо мањи од та два броја. O(NQ)
Решење када сваки упит садржи максимум
Надаље је јасно да је кључни проблем како брзо налазити Декартово стабло за подниз или бар довољно информација о том Декартовом подстаблу. Ако интервал садржи M чији је индекс i онда је јасно да је довољно решити задатак само за [L,i] и [i,R] одвојено, након чега лако налазимо решење укупно. Сада ћемо рачунати одговор за сваки интервал облика [i,R] неком врстом динамичког програмирања, где ћемо се позивати на вредности које смо срачунали динамичког програмирања за цео низ (ако бисмо прво решили задатак за цео низ као у претходном подзадатку). Наиме нека је last[R] највећи индекс броја већег од оног на позицији R. Ако је last[R]=i, потребно нам је само решење за интервал [i+1,R-1]. Уколико није, онда је решење једнако решењу за last[R], али треба да му додамо још производ решења за [last[R]+1,R-1],\cdots, [last^k[R]+1, last^{k-1}[R]-1] (у каснијим подзадацима ћемо видети тачан разлог овоме). Међутим, сва ова решења потпроблема која нам требају су заправо већ израчунати у Декартовом стаблу, тако да већ за те интервале знамо да решимо проблем и комбиновањем свега тога можемо решити овај подзадатак.
Решење када је пермутација насумична
Инспирисани претходним подзадатком, јасно је да се некако све врти око максимума на интервалу L,R, тако да би било лепо када бисмо нашли везу максимума на интервалу и Декартовог стабла. Није тешко уверити се да је најмањи заједнички предак од L i R заиста максимум на интервалу [L,R]. Међутим, сада долази питање, како тачно изгледа то Декартово стабло подниза, и да ли можемо да га изразимо преко Декартовог стабла почетног низа. Испоставља се да можемо, и то на следећи начин: кренимо од чвора L и његовог десног подстабла. Сада идемо путем од L до LCA(L,R): ако дођемо у неки чвор из левог детета, онда тај чвор избацујемо, а чвор из ког смо дошли преспојимо са његовим дедом. Ово исто радимо са R, само заменимо речи “лево” и “десно”. Уверите се сами да оваква конструкција ради!! Како је пермутација рандом генерисана, заправо можемо да тврдимо да је Декартово стабло дубине реда величине O(\log N), па овакву симулацију можемо да вршимо у О(Q\log N), као и онда прерачунавање вредности динамичког програмирања за тих O(\log N) нових вредности по упиту.
Главно решење
Сада треба некако избећи ручну симулацију прављења новог Декартовог стабла, када не знамо да је оно плитко. Ово ћемо радити, наравно, путем *sparse tabela. Наиме за сваки чвор ћемо приметити да нам је операција која се примени на тренутну вредност dp бити облика линеарна облика dp ->dp\cdot x+c. Шта мислимо под овиме? Па ако имамо вредност dp[l], онда налазимо вредност за dp[u]=dp[l]\cdot dp[r]+1, значи трансформацију од dp[l] у dp[u] имамо по горњој формули за k=dp[r], c=1. Међутим, оно што је важно приметити је да је композиција две операције овог типа опет операција тог типа (композивција две линеарне функције је опет линеарна). Тако да ми у спарсе табели можемо наћи како изгледа формула за dp[2^k\text{-ти предак од }u] преко dp[u]. Оно што још важи је да је x\cdot1+0, неутрал за операцију композиције функције. Онда налазимо решење на следећи начин: имамо две табеле, једна која кад идемо на горе од неког чвора кад уђемо слева множи резултат са вредности dp од десног детета и додаје 1, а ако улази сдесна онда не ради ништа и друга која ради обрнуто. Није тешко видети да се на овај начин ако кренемо од L до LCA(L,R) управо рачуна решење проблема за тај подинтервал, а такве операције су све линеарне, па сваку од њих можемо претворити у спарс табелу, која нам дозвољава брзо рачунање решења за тај подинтервал. Затим радимо то за десну страну и спајамо решења као у подзадатку 4. Сложеност O(Q\log N).