[Rešenja zadataka] 2021/2022 Izborno za EGOI

Рачунар

Аутор: Игор Павловић

Текст и тест примери: Игор Павловић

Тестирање: Владимир Миловановић

Анализа решења: Владимир Миловановић

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

Квадратно решење

Довољно је у две угнежђене петље редоследом проћи по свим задацима и за сваки задатак испитати да ли постоји неки други задатак који је почео пре њега, а који се завршава након њега. Другим речима, у петљама за свака два задатка i и j проверавати да ли је A_ј < A_i и B_j > B_i и симултано ажурирати тражено време уписа у меморију на максимално B_j од задатака који задовољавају претходни услов. Најзад, по редоследу проћи и исписати времена. Како се у свакој од две петље пролази кроз све задатке, ово решење има квадратну временску сложеност, односно \mathcal{O}(N^2), где N представља број задатака.

Главно решење у логлинеарној сложености

Да би се проблем решио на ефикасан начин, могу се задаци уместо по индексу сортирати по времену почетка извршавања. Пошто у тако сортираним задацима након i-тог задатка нема задатака који су почели после њега, то је довољно у само једном проласку кроз задатке, водећи рачуна о дотадашњем максимуму, ажурирати време уписа у меморију као тренутну вредност максимума. Најзад, потребно је пре исписа задатке поново сортирати по редоследу учитавања, односно по индексима, како би се у једном проласку исписала тражена времена. Како је операцију сортирања ефикасним алгоритмима могуће извршити у логлинеарној временској сложености \mathcal{O}(N\log N), а како је ово временски најзахтевнија операција у предложеном решењу, то је и укупна сложеност овог решења логлинеарна по броју задатака.

МАТРИЦА

Аутор: Марко Савић

Текст и тест примери: Алекса Милисављевић

Тестирање: Владимир Миловановић

Анализа решења: Драган Урошевић

Нека је N број врста и нека је M број колона. Претпоставимо да су врсте нумерисане бројевима од 0 до N-1, а колоне бројевима од 0 до M-1.

Приметимо да не мора за сваки избор улазних података постојати решење. Наиме ако је 0\leqslant a_i < M, онда то значи да се на пољу са координатама (i,a_i) налази црно поље. Због тога број белих поља којима почиње колона a_i није већи од a_i, па је b_{a_i} \leqslant i. Односно, ако је 0\leqslant a_i < M и b_{a_i} > i за неко i, онда не постоји матрица која задовољава услове описане низовима a и b. Слично, ако је 0\leqslant b_j < N, онда је поље са координатама (b_j, j) црно, па врста b_j почиње са не више од j белих поља и због тога је a_{b_j} \leqslant j. Дакле ако за неко j (0\leqslant j < M) важи да је 0\leqslant b_j < N i a_{b_j}>j, онда не постоји матрица која задовољва услове описане низовима a и b.

Претпоставимо да постоји матрица описана низовима a и b. Тада за свако i за које је 0\leqslant a_i < M важи да је поље са координатама (i,a_i) црно. Слично, ако за неко j важи да је 0\leqslant b_j < N, онда је поље са координатама (b_j,j) црно. И то је минимални скуп црних поља. Према томе, број црних поља ћемо одредити тако што избројимо колико има различитих поља у унији скупова

A=\{(i,a_i)|0\leqslant i < N, 0\leqslant a_i < M\} \quad \text{и} \quad B=\{(b_j,j)|0\leqslant j < M, 0\leqslant b_j < N\}.

Претпоставимо да постоји матрица која задовољава услове описане низовима a и b. Тада могу бити црна сва поља (i,j) (0\leqslant i < N, 0\leqslant j < M) која задовољавају и следећа два услова:

a_i \leqslant j < M \quad \text{и}\quad b_j \leqslant i < N.

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

У овом случају се могу испитати све матрице димензија N\times M чија су поља бела или црна (тј, за сваку од њих се може проверити да ли задовољава услове описане низовима a и b). Наиме матрица има 2^{N M} \leqslant 2^{16} = 65536. Након тога се лако одреди број црних поља у матрици која има најмањи и/или највећи број црних поља.

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

У овом случају се за свако поље матрице одређује да ли је црно, за варијанту када треба да одредимо најмањи број црних поља и/или за варијанту када треба да одредимо највећи број црних поља. За одређивање боје користимо горе наведене услове. Сложеност овог решења је \Theta(NM).

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

Опишимо како одређујемо максимални број црних поља (опет ћемо претпоставити да постоји матрица која задовољава услове проблема). Максималан број црних поља одређујемо тако што одређујемо максималан број црних поља у врстама полазећи од нулте врсте и обрађујући их редом. Ако тренутно обрађујемо врсту са редним бројем i, онда могу бити црна сва поља (i,j) која задовољавају услове j\geqslant a_i и b_j \leqslant i. Један од начина да то урадимо је да дефинишемо помоћни низ c дужине M чији елементи на почетку имају вредност 0, а ако се тренутно обрађује врста број i, онда ће вредности елемената низа c бити

c_j = \begin{cases} 1,\quad &\text{ако је }b_j\leqslant i\\ 0,\quad &\text{ако је }b_j > i. \end{cases}

Тада ће највећи број црних поља у врсти број i бити

c_{a_i} + c_{a_i+1} + c_{a_i+2} + \dotsb + c_{M-1}.

Ове збирове ћемо најефикасније одредити користећи Фенвиково стабло (Fenwick tree) или сегментно стабло. Приметимо да се низ c (потенцијално) мења при обради сваке врсте, па у складу са тим треба ажурирати и одговарајуће стабло. Сложеност овог решења је \Theta(N\log M).

Минимални број црних поља можемо одредити тако што формирамо скуп састављен од парова (i,a_i) (0\leqslant i < N, a_i < M) и (b_ј,ј) (0\leqslant j < M, b_j < N), а затим избројимо колико у том скупу има елемената.

Надвлачење конопца

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

Решење када N \leq 20

За сваки меч има укупно 2 начина да се изабере победник тако да има укупно 2^N укупно начина да се изаберу победници. Напросто прођемо кроз све те комбинације (нпр итерирањем бројева од 0 до 2^N-1 и гледајући њихов бинарни запис) и видимо да ли у свакој од њих се деси да има једну победи. Сложеност O(2^N)

Решење када сваки такмичар учествује у 2 меча

Посматрајмо граф чији су чворови такмичари и постоји грана између два такмичара ако играју меч међусобно. Сада нам је задатак еквивалентан са тиме да се оријентишу гране тако да сваки чвор има излазни степен тачно 1 (овакви графови се иначе зову функционални графови).

У овом подзадатку сваки чвор је степена тачно 2. За такав граф знамо да је свака повезана компонента циклус (докажите!). У циклусу очито имамо само 2 начина да оријентишемо гране (неформално речено у смеру казаљке на сату и супротно). Тако да је у овом случају одговор 2^{\text{број компоненти}}. Сложеност O(N).

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

Заправо је главно решење мала модификација претхоног. Наиме, очито нам је потребан услов да у свакој компоненти има исто чворова и грана (да би могао савко да победи барем једном). Испоставља се да ако је овај услов испуњен, одговор је опет 2^{\text{број компоненти}} (а у супротном је 0).
Доказ овога можемо да видимо на следећи начин: ако постоји чвор степена 1 знамо да он мора да победи тај меч тако да нам је то јединствено одређено и можемо да скинемо тај чвор и грану и опет добијемо граф са исто чворова и грана, и то за 1 мање. Настављамо овај процес, и кад нема ниједан чвор степена 1, тада сви имају степен 2, што по претходном подзадатку знамо да имамо тачно 2 начина да оријентишемо.

Шестоугао

Аутор: Никола Милосављевић

Текст и тест примери: Алекса Милисављевић

Тестирање: Павле Мартиновић

Анализа решења: Алекса Милисављевић

Прва ствар коју треба да приметимо је да услов да је фигура шестогао и да има странице паралелне ивицама матрице заправо значи да је у питању фигура која се добија тако што из правоугаоника избацимо мањи правоугаоник који је такав да им се тачно један ћошак поклапа.

Решење када N \leq 5

У овом подзадатку можемо да фиксирамо сваки шестоугао, проверимо да ли је он леп и прерачунамо одговор за сваку подматрицу. Различитих шестоуглова има О(N^6), док различитих подматрица има O(N^4). Због тога, ово решење ради у временској сложености О(N^{10}).

Временска сложеност је О(N^{10}), а меморијска O(N^4).

Решење када A = 8, Q \leq 10

Приметимо да су шестоуглови са обимом 8 управо квадрати димензија 2 \times 2 из којих је избачен један ћошак. Таквих шестоуглова има O(N^2) у матрици. У сваком упиту можемо да итерирамо кроз целу подматрицу и израчунамо збир бројева у сваком лепом шестоуглу.

Временска сложеност је O(Q \cdot N^2), а меморијска је O(N^2).

Решење када N \leq 50, Q \leq 10

За решавање овог подзадатка морамо детаљније да размотримо када тачно избацивањем мањег правоугаоника из већег настаје леп шестоугао.

Претпоставимо да смо имали правоугаоник димензија w \times h и да смо из једног његовог ћошка избацили правоугаоник димензија p \times q. Посматрајмо два случаја:

  • Први случај: w \neq h, тј. оргинални правоугаоник није квадрат. Без умањења општости, претпоставимо да w > h. Шестоугао који настаје брисањем правоугаоника има странице дужина w, h, w-p, q, p, h-q. Како w \neq h и како у шестоуглу, да би био леп, свака дужина мора да се јавља барем два пута , то мора да важи w = w-p или w = q или w = p или w = h-q. Међутим, како важи p, w-p < w и q, h-q < h < w , то овај случај није могућ, тј. шестоугао мора бити квадарат.
  • Други случај: w = h. Уведимо a = w = h. Шестоугао који настаје брисањем правоугаоника има странице дужина a, a, a-p, q, p, a-q. Како свака дужина мора да се јавља барем два пута, то разликујемо следећа два случаја: p = q и p = a - q. Додатно, приметимо да је обим овог шестоугла управо a + a + a - p + q + p + a - q = 4a, тј. a = \frac{A}{4}.

Дакле, да би шестоугао био леп, он мора да настане тако што се из квадрата странице a = \frac{A}{4} избаци правоугаоник димензија p \times q, за које важи p = q или p + q = a. Приметимо да у почетној матрици квадрата странице a има (N-a+1)^2, а за сваки од њих постоји 4(a-1) правоугаоника које можемо да избацимо да би добили леп шестоугао. Дакле, укупно постоји O(N^3) лепих шестоуглова у матрици.

Користећи ову информацију, лако можемо да решимо подзадатак. У сваком упиту, прођемо кроз све лепе шестоуглове. Ово је најлакше урадити тако што прво фиксирамо горњи леви ћошак квадрата из којег бришемо правоугаоник, затим странице правоугаоника и коначно један од четири ћошка квадрата који се поклапа са правоугаоником.

Временска сложеност је O(Q N^3), а меморијска је O(N^2).

Решење када N \leq 50

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

Временска сложеност је O(Q N^2), а меморијска је O(N^2).

Решење када А = 8

За решења овог подзадатка је неопходна техника sparse tabela.

Прво у помоћној матрици b[i][j] запамтимо леп шестоугао са највећим збиром који је настао тако што смо квадрату коме је горње лево поље управо (i,j) склонили један ћошак.

У помоћној матрици sparse[i][j][k], прерачунамо максимуме свих лепих шестоуглова који настају од квадрата димензија 2 \times 2 којима је горњи леви ћошак на неком од поља из скупа \{(i,j),(i,j+1),...,(i,j+2^k-1)\}. За ову матрицу је лако наћу рекурзивну формулу:

sparse[i][j][0] = b[i][j], sparse[i][j][k] = max(sparse[i][j][k-1],sparse[i][j+2^(k-1)][k-1])

На основу ове матрице, можемо да одговарамо на упите у временској сложености O(N). Нека је k највећи број такав да је 2^k \leq r-l. Да би одговорили на упит, прођемо кроз сваки ред i у интервалу [u,d-1] и за сваки од њих израчунамо вредност max(b[i][l][k],b[i][r-2^k][k]) (на овај начин смо узели максимум свих лепих шестоуглова којима је горњи леви ћошак у реду i). Максимум од свих тих вредности је одговр на упит.

Временска сложеност је O(N^2 \log N + Q N), а меморијска O(N^2 \log N) (ако памтимо увек само резултате претходног кола).

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

За главно решење, неопходно је генерализовати идеју из претходног подзадатка, коришћењем опсервације о томе какав правоугаоник морамо да избацимо да би добили леп шестоугао. У матрици b[i][j] запамтимо максимум свих лепих шестоуглова који су настали тако што смо избацили неки правоугаоник из квадрата којем је горње лево поље (i,j). Потом рачунамо и користимо табелу на сличан начин као у претходном подзадатку.

Временска сложеност је O(N^3 + Q N), а меморијска O(N^2 \log N).

Задатак је било могуће решити и у бољој временској сложености O(N^3 + N^2 \log^2 N + Q), коришћењем дводимензионалних табела, али то није било потребно за максималне поене.