[Решења задатака] 2022/2023 Квалификације - други круг

Спојлер

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

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

Није тешко уочити да на основу резултата a:b на крају утакмице, као и резултата x:y на полувремену, постоји четири различита случаја:

  • x = a и y = b, односно да је резултат на крају једнак резултату на полувремену, па у наставку неће бити голова;
  • x < a и y < b, што даље значи да ће обе екипе постићи гол, па на основу резултата није могуће утврдити која ће екипа забити наредни;
  • x < a и y = b, што имплицира да ће прва екипа постићи наредни гол;
  • x = a и y < b, што значи да ће друга екипа постићи наредни гол.

Једноставним постављањем ова четири услова и одговарајућим исписима долази се до траженог решења у константној временској сложености \mathcal{O}(1).

Финале

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

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

Ако посматрамо путеве на рубу матрице, видимо да и сва поља на рубу (тј. први и последњи ред и колона) морају имати редара. Ако је N \leq 2 или M \leq 2, то значи да ће сва поља у матрици имати редара, па је у том случају решење N \times M.

Надаље претпостављамо да важи N, M \geq 3. Посматрајмо матрицу добијену брисањем првог и последњег реда и колоне - у овој новој (N-2) \times (M-2) матрици ћемо тражити максималан број поља где не морамо поставити редаре, ако знамо да су сви путеви на рубу већ покривени.
За свака два суседна поља важи да барем једно од њих има редара, јер иначе пут који их раздваја не би био покривен. Овај услов је и довољан, јер ће тада и сви путеви бити покривени.

Дакле, потребно је наћи највећи скуп поља у коме не постоје два суседна. Ово је познат задатак: обојимо матрицу шаховски црно-бело и узмемо сва поља оне боје која се више пута појављује. Пошто се број поља црне и беле боје разликује за највише један, биће \lceil \frac{(N-2) \cdot (M-2)}{2} \rceil поља једне, и \lfloor \frac{(N-2) \cdot (M-2)}{2} \rfloor поља друге боје. То значи да можемо имати максимално \lceil \frac{(N-2) \cdot (M-2)}{2} \rceil поља без редара, па је минималан број редара N \cdot M - \lceil \frac{(N-2) \cdot (M-2)}{2} \rceil.

Гужва

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

Даље у решењима ћемо рећи да се крећемо на доле уколико се померамо са поља (i, j) на поље (i+1, j), у супротном се крећемо удесно.

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

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

Уколико је блокирано неко поље у првом реду, нпр. (1, i), онда се морамо померити на доле пре i-те колоне, па је решење \min(d_1, d_2, \ldots d_{i-1}). Уколико је блокирано неко поље у другом реду, нпр. (2, j), онда се морамо померити на доле после i-те колоне, па је решење \min(d_{i+1}, d_{i+2}, d_M).

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

Решење када Q \leq 100, N, M \leq 7

Решење можемо добити brute force методом, односно испробавањем свих могућих путева од првог до последњег поља, за свако блокирано поље. Таквих путева постоји {N+M-2 \choose N-1} (имамо укупно N+M-2 корака, од којих бирамо N-1 да буду усмерени на доле). Све путеве можемо проверити рекурзијом.

Временска сложеност је O(Q\cdot{N+M-2 \choose N-1}), а меморијска O(NM).

Решење када Q \leq 2000, N \cdot M \leq 2000

За свако блокирано поље, користићемо динамичко програмирање - израчунаћемо dp_{i, j}, најмањи број навијача које морамо да сретнемо на путу од (1, 1) до (i, j), ако не посетимо тренутно блокирано поље. Јасно је да важи dp_{1, 1} = a_{1, 1} и dp_{i, j} = dp_{i-1, j} + dp_{i, j-1}, с тим што приликом рачунања увек прескачемо поља која су ван матрице и тренутно блокирано поље. Решење се онда налази у dp_{N, M}.

Временска сложеност је O(QNM), а меморијска O(NM).

Решење када Q \leq 10^4

Као у претходном решењу, израчунајмо низ A_{i, j} - најмањи број навијача које морамо да сретнемо на путу од (1, 1) до (i, j), и слично B_{i, j} - најмањи број навијача које морамо да сретнемо на путу од (i, j) до (N, M).

Рецимо да блокирамо поље (x, y). Посматрајмо сва поља (x', y') за која важи x+y = x' + y'. Можемо видети да се заправо сва ова поља налазе на истој дијагонали, као и да на сваком путу од (1, 1) до (N, M) пролазимо кроз тачно једно од ових поља.

Ово нам говори да, како бисмо гарантовали да не пролазимо кроз поље (x, y), довољно је да гарантујемо да пролазимо кроз неко друго поље на овој дијагонали. Можемо наћи пут са најмање навијача који пролази кроз поље (i, j) са A_{i, j} + B_{i, j} - a_{i, j}.

Можемо, дакле, проћи кроз сва поља на дијагонали блокираног поља и видети за које добијамо најмањи пут. Битно је приметити да је број поља на тој дијагонали највише \min(N, M), што је мање од \sqrt{NM}.

Временска сложеност је O(Q\cdot \sqrt{N M} + NM), а меморијска O(NM).

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

Урадимо све исто као у претходном решењу, сем што ћемо ефикасније наћи минимум на дијагонали без једног поља. То ћемо урадити тако што ћемо чувати префиксни и суфиксни минимум за сваку дијагоналу. За блокирано (x, y) узећемо минимум од префикса до (x-1, y+1) и суфикса од (x+1, y-1).

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

Формација

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

За три тачке A, B и C кажемо да тројка (A, B, C) има леви заокрет уколико ако се крећемо од A до C преко тачке B морамо скренути у лево. Слично дефинишемо десни заокрет. Тачке A, B и C су колинеарне уколико постоји права која садржи све три. Све ово можемо проверити користећи векторски производ вектора \overrightarrow{AB} и \overrightarrow{BC}.

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

За сваки подскуп потребно је проверити посебно. Имамо три подскупа са два играча, где је потребно проверити да ли се Меси налази на дужи између та два играча. То можемо тако што проверимо да ли је колинеаран са та два играча, као и да су му x и y координатe између њихових.

Такође је потребно проверити за подскуп од сва три фудбалера. Ако је Меси у тачки M, а три дате тачке A, B и C, онда је потребно да тројке (A, B, M), (B, C, M) и (C, A, M) имају исти заокрет, како би се M налазио у конвексном омотачу тачака A, B и C.

Временска и меморијска сложеност је O(1).

Решење када y_1 = 1 и y_k = -1, за 1 < k \leq N

Јасно је да ћемо играча са дресом број 1 морати да укључимо у подскуп како би конвексни омотач садржао тачку (0, 0).

Посматрајмо тачку (-x_1, -1). Постоји два случаја:

  • Уколико постоји играч који се налази у тој тачки, тада, ако га укључимо у подскуп, можемо узети било који подскуп осталих играча, којих има 2^{N-2}. Сем тога, морамо додати број подскупова у којима се не налази тај играч;
  • Уколико не постоји играч у тој тачки, нећемо додати 2^{N-2} на решење.

Рецимо да посматрамо број подскупова који не садрже играча у тачки (-x_1, -1) (ако такав уопште постоји). Јасно је да онда морамо узети макар једног играча лево (односно са мањом x координатом) од те тачке и макар једног играча десно (односно са већом x координатом). Ако са L означимо број играча лево, а са R број играча десно, онда је решење (2^L-1)\cdot (2^R - 1) (на шта додајемо 2^{N-2} уколико постоји играч у тачки (-x_1, -1)).

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

Решење када y_k \in \{-1, 1\}, за 1 \leq k \leq N

Слично претходном решењу, морамо да имамо макар по једног играча са обе y координате. Ако фиксирамо најлевљу и најдешњу тачку са праве y = 1 из подскупа који бирамо, онда поново налазимо L и R и примењујемо сличну формулу као у претходном решењу.

Ово је преспоро па је потребно да приметимо да L зависи само од најлевље одабране тачке, а R само од најдешње одабране тачке. Ово користимо уз технику префиксних сума, да нађемо збир свих подскупова за фиксирану најлевљу тачку (а кроз све могуће најдешње).

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

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

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

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

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

Уместо да рачунамо број подскупова у чијем конвексном омотачу се Меси налази, од 2^N - 1 одузмимо број подскупова у чијем конвексном омотаче се не налази Меси. То радимо зато што је лакше проверити овај услов - довољно је да постоји права кроз (0, 0), тако да су све тачке подскупа са исте стране ове праве.

Претпоставићемо да нема колинеарних тачака (чак ни кад рачунамо Месијеву позицију). Решање колинеарних тачака сведе се детаље имплементације. Кренувши од позитивне x осе, сортирајмо тачке по поларном углу око тачке (0, 0), растуће. Означимо са M тачку (0, 0).

Фиксирајмо сваку тачку p_i и са cnt означимо број других тачака које имају леви заокрет са вектором од p_i до M. Онда је број подскупова у којима је p_i најлевља тачка (тачка таква да није заокрет (M, x, p_i) није надесно, за свако x у подскупу), а да конвексни омотач не садржи тачку M - 2^{cnt}. Када од 2^N - 1 одузмемо овај резултат за сваку тачку p_i, добијемо коначно решење. Број cnt можемо одржавати техником два показивача.

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

Опклада

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

Решење када је l_{i,j}=u_{i,j}

Нека је c_i број операција које смо применили на i-ту колону, а r_i број операција које смо применили на i-ти ред. Преимтимо да је онда m_{i,j}=r_{i}-c_{j}. из овога можемо да закључимо да је m_{i,j}=r_{i}-c_{j}=r_{i}+r_{1}-c_{j}-c_{1}-m_{1,1}=(r_i-c_1)+(r_1-c_j)+m_{1,1}=m_{i,1}+m_{1,j}-m_{1,1}. Може се без већих потешкоћа доказати да је овај услов потребан и довољан услов за Момирову крајњу табелу (суштински решавањем система једначина за r_i и c_i). Тако да је потребно само проверити услов и налазимо решење у O(TNM).

Решење када је l_{i,j}=u_{i,j} у првом реду и колони

Из претходног подзадатка можемо да видимо заправо да пошто су нам фиксирани први ред и колона да нам је остатак табеле фиксриан. Онда само израчунамо које вредности морају да се налазе на крају у сваком пољу и проверимо да ли је у траженом интервалу. Сложеност: O(TNM).

Решење када je u_{i,j}-l_{i,j}\leq1 и N,M<=10

У овом подзадатку, користимо решење претходног. Наиме приметимо да за вредности у првом реду и колони имамо највише 2^{M+N-1} опција. Фиксирамо сваку од тих опција и пробамо алгоритмом сличан ономе у претходном подзадатку (са потенцијално неким одсецањем због убрзања). Сложеност: O(T2^{M+N}NM)

Решење када је l_{i,j}=u_{i,j} у свим белим пољима

Вратимо се на интерпретацију m_{i,j}=r_{i}-c_{j}. Видимо да нам поље где је l_{i,j}=u_{i,j} даје јединствену везу између r_{i} и c_{j}. Због услова овог задатка, све вредности r_i и c_i ћемо моћи да изразимо само преко r_1 или само преко r_2. Када се те везе испуне и убаце у неједначине осталих поља, онда ће сва преостала поља да нам дају неке неједначине облика a\le r_1-r_2\le b. Комбинујући ове неједнакости по свим пољима, налазимо у ком интервалу r_1-r_2 заиста треба да буде (као пресек свих горенаведених интервала), и одатле можемо да узмемо произвољну вредности. На крају пустимо алгоритам из трећег подзадатка (другом у овом текстуалном решењу), да бисмо видели да ли је валидно решење то које смо нашли.

Решење без додатних ограничења

Приметимо да нам се услови у суштини своде на l_{i,j}\leq r_i-c_j\leq u_{i,j}. Презапишимо ово као r_i-c_j\leq u_{i,j} и c_j-r_i\leq-l_{i,j}. Сада смо свели задатак: на решавање система неједначина по променљивима x_1,x_2\cdots,x_{M+N} где је свака неједначина облика x_i-x_j\leq c. Постоји генерални начин на који се ово решава који ћемо презентовати овде.

Направимо граф чији чворови одговарају променљивима нашег система неједначина. Направимо за сваку неједначину облика x_i-x_j\leq c грану од чвора j до чвора i са тежином c. Пустићемо алгоритам Белман-Форд, да бисмо нашли дистанцу од 1 до сваког другог чвора у овом графу. Тврдимо да уколико у нашем графу постоји негативан циклус, одговор је да решење не постоји, док ако не постоји негативан циклус, решење увек постоји и налатимо га као x_i=dist(1,i). Уколико постоји негативан циклус, онда нека је то циклус a_1,a_2,\cdots,a_k. Тада за њих имамо неке неједнакости облика x_{a_i}-x_{a_{i+1}}\leq c_{i} (индекси узети по модулу k). Сада кад саберемо ове једначине, сваки од променљивих нам се скрати и добијамо 0\leq c_1+c_2+\cdots+c_k<0 (јер је у питању негативан циклус). Из овога закључујемо да кад има негативан циклус, решење заиста не постоји. Сада претпоставимо да негативан циклус не постоји. Докажимо да је x_i=dist(1,i) заиста решење. Треба да се уверимо да је dist(1,i)-dist(1,j)\leq c, односно dist(1,j)+c\geq dist(1,i), што је свакако тачно јер је десна страна најкраћи пут од 1 до i, док лева страна представља неки пут од 1 до i, где прво идемо до j а онда од j до i директном граном тежине c. Овиме смо се уверили да је ово заиста решење.

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

Овиме смо решили задатак у O(TNM(N+M)).

1 Like