[Решења задатака] 2022/2023 Окружно

Кувар

Аутор: Владимир Миловановић
Текст и тест примери: Димитрије Ердељан
Анализа решења: Димитрије Ердељан
Тестирање: Марко Шишовић

Анализа

Прва два подзадатка можемо једноставно решити са две угњеждене петље које испробавају сваки пар (i, j) и броје за колико таквих парова је X_i = Z_{Y_j}. Временска сложеност овог алгоритма је \mathcal{O}(N^2), што неће бити довољно за преостале подзадатке.

Алгоритам можемо побољшати тако што раздвојимо ове две петље: прво ћемо пребројати колико постоји епизода за свако могуће јело, односно израчунати низ C, где је C_i број индекса j где X_j = i. Пошто су све вредности X_i највише N, овај низ стаје у меморију и можемо га попунити једним пролазом кроз X.

Сада је довољно да прођемо кроз Z, и за свако Z_i укупном броју додамо C_{Z_i} (број елемената у X који би били одговарајући пар). Временска сложеност је сада \mathcal{O}(N), сасвим довољно за N \leq 10^5.

Размена знака

Аутор: Павле Мартиновић
Текст и тест примери: Павле Мартиновић
Анализа решења: Драган Урошевић
Тестирање: Драган Урошевић

Анализа

Претпоставимо за тренутак да се операција коју извршава Жика састоји само од замене места два суседна елемента, тј. да се не извршава промена знака. Може се показати да се применом такве операције, од полазног низа може добити било који низ састављен од елемената низа A, тј. било који распоред елемената низа A:

A_{i_1}, A_{i_2}, A_{i_3}, \dots, A_{i_n}.

Ако операција коју изводи Жика састоји и од промене знака, онда је за одређивање вредности неког елемента након извођења свих операција довољно да знамо његову почетну позицију и његову позицију на крају (тј. након свих изведених операција). Наиме, чак и у случају да се исти елемент померао лево-десно (према почетку и према крају), његов знак на крају ће бити одређен само растојањем између почетне о крајње позиције (зато што се при сваком померању лево-десно или десно-лево изводи паран број операција, па елемент низа промени знак паран број пута, а то значи да има исти знак као да то померање лево-десно није ни изводио).

Према томе, ако се елемент A_i преместио са позиције i на позицију j (j\lt i), онда ће његова вредност бити B_j = (-1)^{i-j}A_i, тј. B_j = (-1)^i : (-1)^j A_i, односно важиће (-1)^j B_j = (-1)^i A_i. Слично, ако се елемент A_i преместио са позиције i на позицију j (j>i), онда ће његова вредност бити B_j = (-1)^{j-i}A_i = (-1)^{i-j}A_i, тј. B_j = (-1)^i : (-1)^j A_i, односно важиће (-1)^j B_j = (-1)^i A_i. Одавде закључујемо да Жика од низа A може добити низ B ако и само ако се низови C (C_i = (-1)^iA_i) и D (D_i = (-1)^iB_i) састоје од истих елемената (наравно, не нужно на истим позицијама).

Решење првог подзадатка

У овом случају је довољно одредити позиције елемената који су различити од нуле. Ако је A_i \ne 0 и B_j \ne 0, тада могу наступити три случаја

  • Ако је A_i = B_j и 2 | (i-j), онда се од низа A може добити низ B;
  • Ако је A_i = -B_j и 2 \not | (i-j), онда се од низа A може добити низ B;
  • Ако не важи ниједан од два горња услова, онда од низа A није могуће добити низ B.

Сложеност описаног решења је \Theta(n).

Решење другог подзадатка

Према анализи, низ B се може добити од низа A ако и само ако се низови C (C_i = (-1)^iA_i) и D (D_i = (-1)^iB_i) састоје од истих елемената. Међутим сви елементи низова C и D имају вредност 1 или -1 и довољно је избројати да ли низови C и D имају исти број елемената чија је вредност 1 (односно исти број елемената чија је вредност -1),
Сложеност описаног решења је \Theta(n).

Решење трећег подзадатка

У овом случају можемо сортирати низове парова E (E_i = (|A_i|, i)) и F (F_i=(|B_i|, i)), при чему парове поредимо по вредности првог елемента (компоненте) пара. Тада од низа A можемо добити низ B, ако и само ако за све одговарајуће парове важи

  • први елементи парова морају бити једнаки (јер они представљају апсолутне вредности одговарајућих елемената низова A и B);
  • други елементи парова представљају позиције тих елемената у низовима A и B; на основу позиција можемо сазнати и одговарајуће елементе низова A и B; они треба да буду једнаки (ако је разлика позиција парна) или супротних знакова (ако је разлика позиција непарна).

Сложеност описаног решења је \Theta(n\log n), због сортирања низова.

Главно решење

Користимо чињеницу да низови C и D, описани у Анализи, треба да садрже исте елементе (наравно, ако се од низа A може добити низ B). Ако те низове сортирамо, онда одговарајући елементи имају једнаке вредности. Због тога можемо сртирати низове C и D и проверити да ли су одговарајући елементи једнаки. Сложеност описаног решења је \Theta(n\log n), због сортирања низова.

Једноставни пикадо

Аутор: Момчило Тошић
Текст и тест примери: Момчило Тошић
Тестирање: Алекса Милисављевић
Анализа решења: Момчило Тошић

Анализа

Уочимо да Бане добија поене само ако изабере тачку са x координатом међу унетим x координатама, и са y координатом која такође припада некој од контролних тачака.
Дакле, за решење за првих i тачака бирамо x_A из скупа x_1,x_2,\ldots x_i и y_A из скупа y_1,y_2,\ldots y_i такве да је описана сума максимална.

Решење у O(M^4)

За свако i \leq M потребно је итерирати кроз све могуће парове x_A,y_A из поменутих скупова (квадратна сложеност) и пронаћи збир из задатка (линеарна сложеност).
Укупно је потребно O(M^4) корака.

Решење у O(M^3)

Фиксирајмо x координату. Тада је формула за број поена који максимизујемо у облику \sum_{j=1}^{i} const*|y_j-y_A|

Интуиција нам говори да ова сума “одлази у бесконачност” када изабрана ипсилон координата или велика (ка бесконачности) или мала (ка минус бесконачности) те можемо покушати само вредност највећег y_j и најмањег y_j, што даје брже решење јер радимо исто као у прошлом подзадатку само проверавамо две вредности за y (минимум и максимум
ажурирамо како се уносе нове тачке).

Решење у O(M^2)

Докажимо интуицију из претходног решења. Доказаћемо грамзив приступ тако што докажемо да увек можемо добити решење које није лошије тако што уместо неке ипсилон координате изаберемо неку мању или већу (и стога је најбоље бирати најмању или највећу).

Нека су сви y једнако размакнути (ово није проблематична претпоставка, наиме, ако нису, додавањем фиктивних међувредности ништа не мењамо јер ове вредности дају скор 0).
Фиксијармо x координату и посматрајмо решење за N тачака и одабрано y=y_i. Тада посматрајмо како се сума мења ако одаберемо y координату лево, односно десно, од
y_i.
Наиме, ако је фиксирано x, сума је у облику \sum_{j=1}^{N} const*|y_j-y_i|

Покушајмо сада да видимо шта се дешава када
изабрану ипсилон координату “померимо” за \Delta y које је разлика двеју ипсилон координата (даље формуле не зависе од тога да ли је позитивно или негативно).

Нека су и без губљења општости ипсилон координате уређене тако да је првих i-1 мање од y_i, а између i и k су једнаке, док су након k веће.
Тада ће сума бити (const представљају позитивне константе - апсолутне разлике x координата и фиксиране x коорд.)
\sum_{j=1}^{N} const*|y_j+\Delta y-y_i| = \sum_{j=1}^{i-1} const*(y_i-y_j-\Delta y)+\sum_{j=k}^{N} const*(y_j+\Delta y-y_i) + (k-i)*const*|\Delta y|
Издвојимо претходну суму:
\sum_{j=1}^{N} const*|y_j-y_i| - \sum_{j=1}^{k} const*\Delta y + \sum_{j=k+1}^{i} const*\Delta y + const*|\Delta y| = \sum_{j=1}^{i} const*|y_j-y_A| + P_i*\Delta y + Q_i*|\Delta y|
Видимо да се Банетов скор променио за P_i*\Delta y + Q_i*|\Delta y|.

Да ли је P_i позитиван, негативан, или нула не зависи од тога да ли покушавамо да се “померимо” у лево или у десно већ само од икс вредности. Како је Q_i увек ненегатино,
то је P_i*\Delta y + Q_i*|\Delta y| у зависности од знака \Delta y (позитивно представља померање у десно, ка највећем y, а негативно у лево, ка најмањем) или у оба случаја ненегативна вредност, или у једном случају негативна, а у другом ненегативна. Свакако, можемо одабрати оно y за које је ова вредност ненегативна, односно Банетов скор није мањи, и стога се “померити” ка највећем или најмањем y. Индуктивно следи да највеће или најмање y које можемо да одаберемо и дају најбоље решење.

Ако сада фиксирамо y, због потпуно симетричног израза, аналогно доказујемо да треба одабрати најмање или највеће x.
Избор једне координате не зависи од избора друге, те долазимо до закључка да постоји само 4 могућности за x_A,y_A а то су највећа и најмања x и y координата.

Ове четири суме можемо израчунати за сваки префикс низа тачака, или искористити идеју раздвајања на две суме из доказа за пун број поена.

Решење у O(M)

Уочимо да ако бирамо екстремне вредности x и y координата суме губе апсолутне заграде и могу се расписати тако да у њима факторишу
\sum_{i=1}^{N}x_i*y_i,
x_A*\sum_{i=1}^{N}y_i,
y_A*\sum_{i=1}^{N}y_i и
y_A*x_A, те се 4 могуће суме могу израчунати у константој сложености ако се суме из ових фактора ажурирају приликом уноса сваке нове тачке.

Поклон

Аутор: Јован Бенгин
Текст и тест примери: Јован Бенгин
Анализа решења: Драган Урошевић
Тестирање: Игор Павловић

Решење првог подзадатка

У овом случају, због ограничења на дужину низа A (број N) и број упита Q, могуће је за сваки упит (L_i, R_i) проверити да ли подниз постаје сортиран након избацивања елемента A_j (j= L_i, L_i+1, L_i+2, \dots R_{i-1}, R_i). Провера да ли је низ сортиран изводи се тако што се пореде парови узастопних (наравно, узимајући у обзир да је избачен елемент A_j, па су елементи A_{j-1} и A_{j+1}, ako je L_i < j < R_i, узастопни). Сложеност овог решења је O(QN^2).

Решење другог и трећег подзадатка

Решење ових подзадатака добија се “профињењем” решења за први задатак. То “профињење” се постиже тако што се за вредности ј за које је A_{j-1}\leq A_j \leq A_{j+1} не проверава да ли је подниз добијен избацивањем елемента A_j сортиран (јер елемент A_j “не смета”, будући да је, по вредности, између елемената лево и десно од њега). Током обраде се проверава да ли је подниз који садржи све елементе од позиције L_i до позиције R_i сортиран и ако јесте онда је одговор на упит “ДА”. Наравно, и у случају да се за неко j испостави да је подниз добијен након избацивања елемента A_j сортиран, одговор је “ДА”.

Решење четвртог подзадатка

У овом подзадатку је могуће са сваки индекс i (1\leq i \leq N) одредити:

  • индекс j (j\geq i) првог елемента у делу низа кога чине елементи A_i, A_{i+1}, A_{i+2}, \dots, A_N који има вредност 1; означимо ту вредност са next_{i,1}; ако такав елемент не постоји онда ће одговарајући индекс имати вредност N+1.
  • индекс j (j\geq i) првог елемента у делу низа кога чине елементи A_i, A_{i+1}, A_{i+2}, \dots, A_N који има вредност 2; означимо ту вредност са next_{i,2}; ако такав елемент не постоји онда ће одговарајући индекс имати вредност N+1.

Овај део се може одрадити након учитавања елемената низа, а пре одговарања на упите.

Када одговарамо на упит за пар бројева (L,R), онда одређујемо индекс X првог елемента од позиције L који има вредност 2 (X=next_{L,2}) и индекс Y првог елемента од позиције X који има вредност 1 (Y=next_{X,1}).
Може се показати да ће одговор бити “ДА” само у следећим случајевима

  • ако је Y>R (јер су елементи од позиције L до позиције X-1 једнаки 1, а од позиције X па до позиције Y-1\geq R једнаки 2;
  • ако је next_{Y+1,1}>R, јер се може избацити јединица са позиције Y, и тако ће се добити блок двојки од позиције X па до позиције next_{Y+1,1}-1 \geq R и подниз ће бити сортиран;
  • ако је Y=X+1 и next_{next_{Y,2},1}>R, јер се на позицији X налази број 2, али одмах након тога број 1, а након прве двојке после позиције Y следи блок двојки који се завршава након позиције R; брисањем двојке на позицији X добија се сортиран подниз.

У свим осталим случајевима, одговор је “НЕ”.
Матрица next може бити израчуната у времену \Theta(N), а како је сложеност одговора на сваки упит \Theta(1), то је укупна сложеност \Theta(N+Q).

Главно решење

За сваки индекс i (1\leq i \leq N) се може одредити највећи индекс j тако да је подниз од индекса i до индекса j неопадајући:

A_i \leq A_{i+1} \leq A_{i+2} \leq \dotsb \leq A_{j-1} \leq A_j.

Означимо индекс j који има горњу особину са last_i. Приметимо да је last_i = N или је A_{last_i} > A_{last_i+1}.
Тада ће одговор на упит за пар индекса (L,R) бити “ДА” у следећим случајевима:

  • ако је last_L \geq R-1 (јер може бити обрисан A_R)
  • ако је last_{last_L+1} \geq R и last_L = L или је A_{last_L-1} \leq A_{last_L+1}, јер се брисањем елемента A_{last_L} добија сортиран подниз.
  • ако је last_{last_L+2} \geq R и A_{last_L} \leq A_{last_L+2}, јер се тада брисањем елемента A_{last_L+1} добија сортиран подниз.

Елементи низа last могу бити срачунати коришењем следећих чињеница:

  • last_N = N,
  • last_i = last_{i+1} ако је A_i \leq A_{i+1} и last_i = i, ako je A_i > A_{i+1}, за i=N-1, N-2, \dots, 2, 1.
    Према томе, сложеност израчунавања елемената низа last је \Theta(N), а будући да је сложеност одговарања на један упит \Theta(1), сложеност комплетног решења је \Theta(N+Q).

Кромпири

Аутор: Игор Павловић
Текст и тест примери: Игор Павловић
Анализа решења: Игор Павловић
Тестирање: Никола Пешић

Решење када N=M, a_i \leq c_i \leq b_i \leq d_i

У овом подзадатку је довољно дуж дијагонале посадити b_i кромпира.

Решење када a_i = b_i, c_i = d_i

За решавање овог подзадатка можемо применити технику два показивача. Показивач i итерира по редовима, а показивач j итерира по колонама.
Ако је b_i=0 или d_i=0 тада увећамо i то јест j за 1. Ако је b_i \neq 0 и d_j \neq 0 посади min(b_i,d_j) кромпира на поље i, j и смањи b_i и d_j за min(b_i,d_j).

Решење када a_i = b_i

Овај подзадатак можемо решити аналогно претходном. У овом подзадатку је потребно итерирати по колонама 2 пута. Први пут постављамо број кромпира у свакој колони на доњу границу, а други пут на горњу и ажурирамо број кромпира у свакој колони. Када завршимо са итерацијом по редовима тада прекидамо итерацију по колонама такође. Након што смо одредили број кромпира у свакој колони можемо применити решење из претходног подзадатка.

Решење када N = 1

У случају да важи \sum_{i=1}^{M} d_i \leq b_1 довољно је само у i-тој колони посадити d_i кромпира.

У супротном се решење овог подзадатка своди на решење претходног када доњу границу поставимо да буде једнака горњој (јер је неопходно посадити b_i кромпира у првом реду како бисмо максимизовали принос).

Решење када a_i = c_i = 0

Овај подзадатак можемо решити грамзивом методом и техником 2 показивача. Показивач i итерира по редовима, а показивач j итерира по колонама.
Ако је b_i=0 или d_i=0 тада увећамо i то јест j за 1. Ако је b_i \neq 0 и d_j \neq 0 посади min(b_i,d_j) кромпира на поље i, j и смањи b_i и d_j за min(b_i,d_j). Приметимо да је ово решење идентично подзадатку 2 само што је у овом случају неопхоно завршити итерацију по колонама чим се заврши итерација по врстама и обрнуто. У подзадатку 2 се ове две итерације заршавају истовремено с обиром да решење мора постојати.

Главно решење

Приметимо прво да није могуће посадити више од min(\sum_{i=1}^{N} b_i,\sum_{j=1}^{M} d_i) кромпира укупно. Дакле уколико конструишемо решење са тачно min(\sum_{i=1}^{N} b_i,\sum_{j=1}^{M} d_i) кромпира онда смо такође достигли максималан могући принос.

Без умањења општости претпоставимо да важи \sum_{i=1}^{N} b_i \leq \sum_{j=1}^{M} d_i. Да бисмо максимизовали принос потребно је у сваком реду посадити b_i кромпира. Пошто нам је познат број кромпира који је потребно посадити у сваком реду сада се решење задатка своди на решење подзадатка 3. Приметимо такође да укулико постоји неко решење тада важи \sum_{j=1}^{M} c_i \leq \sum_{i=1}^{N} b_i, одакле следи да могуће конструисати решење са тачно min(\sum_{i=1}^{N} b_i,\sum_{j=1}^{M} d_i) применом алгоритма из подзадатка 3.

Сднеирф

Аутор: Павле Мартиновић
Текст и тест примери: Павле Мартиновић
Анализа решења: Јован Бенгин
Тестирање: Алекса Милисављевић

Анализа

Приметимо прво да никада не морамо направити потез са неким X које није степен двојке. Наиме, уместо једног потеза са X = 2^{i_1} + 2^{i_2} + 2^{i_3} + .... + 2^{i_k}, i_1 < i_2 < ... < i_k, можемо да направимо k потеза над истим путем са вредностима 2^{i_1}, 2^{i_2}, ... , 2^{i_k}. Дакле, можемо претпоставити да ће X које бирамо увек бити облика 2^j.

Пошто сада ниједан потез над неким битом не утиче на друге, можемо за сваки бит независно наћи оптимално решење и на крају их сва сумирати.
Формалније, дефинишимо матрице B_0, B_1, ... , B_K, где је B_{x, i, j} = 1 ако A_{i, j} садржи x-ти бит, у супротном је B_{x, i, j} = 0. Ако је C_i оптимално решење за матрицу B_i, онда је оптимално решење за матрицу A једнако \sum\limits_{i=0}^{K} 2^i*C_i. Пошто важи A_{i,j} \leq 10^9 < 2^{30}, довољно је узети K = 29 (јер би матрице B_i за веће вредности i садржале само нуле, па би и C_i било 0).

Даље ћемо разматрати само матрице чији су сви чланови 0 или 1, а потезе вршимо искључиво са X = 1. Циљ нам је да добијемо матрицу са минималним бројем јединица.

Решење када је N, M \leq 2

Ако је N = 1 или M = 1, постоји тачно један пут од (1, 1) до (N, M). Ако је N = M = 2, постоје два пута.
Пошто постоје највише два различита пута, тиме и највише четири различите комбинације потеза (пошто се два иста потеза скраћују), можемо за сваку комбинацију проверити како ће матрица изгледати, и узети ону са најмањом резултујућом сумом.

Решење када је N = 1

Пошто постоји само један могућ пут, постоје само два могућа низа потеза: један где не радимо ништа (тада ће матрица садржати a јединица), и други где пут пролази кроз целу матрицу (тада ће матрица садржати M - a јединица), па ће решење бити min(a, M - a).

Решење када је N = 2

Груписаћемо поља тако да сва поља са истом i + j вредности буду у истој групи. Свака група ће онда заправо бити дијагонала која иде од доле-лево ка горе-десно, и садржаће највише два поља.

Приметимо да сваки пут од (1, 1) до (N, M) садржи по тачно један елемент из сваке групе. То значи да ако је укупан xor свих елемената неке групе једнак 0, после једног потеза биће 1, и обрнуто. Нека на почетку a дијагонала има xor једнак нули, а b дијагонала xor једнак јединици. Онда ће након једног потеза бити b дијагонала са xor 0, и a са 1, након другог потеза ће поново бити a са 0 и b са 1 итд. Пошто свака дијагонала која има xor једнак јединици мора да садржи барем једну јединицу, видимо да је решење барем min(a, b).

Испоставља се да је овај минимум увек могуће постићи. Без умањења општости, нека је a \geq b (b < a се ради на исти начин, само што се на почетку уради било који потез). Показаћемо да је дијагонале са xor-ом 1 (којих има b) могуће трансформисати тако да имају тачно једну јединицу, а оне са xor-ом 0 тако да немају ниједну.

За дијагонале које садрже једно поље је очигледно: ако им је xor 0, онда је њихов једини елемент 0, уосталом је 1.
Дијагонале које садрже два поља и имају xor 1 такоће садрже тачно једну јединицу.
Остало нам је да покажемо да, ако имамо дијагоналу која садржи две јединице, можемо обе претворити у нуле а да не мењамо остале елементе. Нека су елементи те дијагонале (2, i) и (1, i + 1). Направићемо два потеза: у првом бирамо пут (1, 1), (1, 2), ... , (1, i), (1, i+1), (2, i+1), (2, i+2), ..., (2, M), а у другом пут (1, 1), (1, 2), ... , (1, i), (2, i), (2, i+1), (2, i+2), ... , (2, M). Приметимо да су једина поља која се налазе у тачно једном путу баш (2, i) и (1, i + 1). То значи да су то једина два поља чија ће се вредност обрнути, па тако од две јединице добијамо две нуле.

Решење када су све почетне вредности 0 или 1

Пошто смо почетну матрицу A поделили на матрице са вредностима 0 и 1, овај подзадатак се решава на исти начин као главно решење. Ипак, могуће га је урадити и без знања да можемо независно налазити решење за сваки бит.

Главно решење

Слично као у решењу за N = 2, груписаћемо поља по дијагонали. Овде се такође испоставља да, ако имамо a дијагонала са xor 0 и b са xor 1, решење је min(a, b). Ово можемо показати на сличан начин као за N = 2, само што сада морамо за сваку дијагоналу са непарним бројем јединица доказати да је можемо трансформисати да има једну јединицу, а за оне са парним бројем јединица да немају ниједну.

На сличан начин као у случају N = 2, можемо у два потеза обрнути вредности нека два поља (i, j) и (i -1, j + 1). Ако дијагоналу представимо као низ, ова операција нам заправо значи да обрћемо вредности нека два суседна поља. Употребом ове операције треба да добијемо минималан број јединица.

Ово се може урадити на следећи начин: итерирамо кроз низ слева надесно, и ако наиђемо на неки елемент који је 1 (а није последњи), једном операцијом обрћемо њега и следећи елемент.
На крају ће сви елементи низа бити 0, сем евентуално последњег. Пошто наша операција не мења парност броја јединица, ако је на почетку био непаран број јединица, последњи елемент ће бити 1, уосталом ће бити 0, па смо доказали да је могуће достићи жељени минимум.

Укупна сложеност ће бити O(NMlog(max(A_{i,j})), јер за сваки бит решење налазимо у O(NM).