Vedúci sedia v T21, nič nerobia a zrazu si spomenú, že možno by chcelo aj zverejniť nové úlohy do KSP.
„Nejak sme zabudli na prvú úlohu, mali by sme s tým niečo spraviť“, povedal Stanko.
„No dobre, tak ja rýchlo spravím vstupy a vy si napíšte zadanie, to sa mi robiť nechce“, hovorí Andrej.
„Joooj ja by som to zadanie možno spravil, ale nemám pri sebe počítač, budem vám to zadanie diktovať a niekto ho prosím píšte“, sťažuje sa Miško.
Miestnosť, v ktorej sú vedúci, má tvar obdĺžnika s $n$ riadkami a $m$ stĺpcami, teda dokopy $n \cdot m$ políčok. Počítač, na ktorom sa dá písať zadanie prvej úlohy do KSP, sa nachádza v riadku $a$ a stĺpci $b$. Ako ste mohli vidieť, tak vedúcim sa zadanie písať nechce, takže chcú byť od počítača čo najďalej. Kam sa majú vedúci postaviť?
Vzdialenosť medzi 2 políčkami počítame ako minimálny počet políčok, cez ktoré máme prejsť, aby sme sa dostali z jedného na druhé s tým, že sa vieme posúvať iba na hranou susediace políčka (Manhattanská vzdialenosť).
V prvom riadku vstupu sú rozmery miestnosti, teda čísla $n$ a $m$ ($1 \leq n,m \leq 10^6$) oddelené medzerou.
V druhom riadku vstupu je pozícia počítača, teda 2 čísla $a$ ($1 \leq a \leq n$) a $b$ ($1 \leq b \leq m$).
| Sada | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| $1 \leq n \leq$ | $1$ | $10^6$ | $10^6$ | $10^6$ |
| $1 \leq m \leq$ | $10^6$ | $10^6$ | $10^6$ | $10^6$ |
| $1 \leq n \cdot m \leq$ | $10^6$ | $10^6$ | $10^{12}$ | $10^{12}$ |
Navyše je garantované, že v 3. sade je miestnosť tvaru štvorca, teda $n = m$.
Vypíš jeden riadok a v ňom pozíciu vedúcich, teda 2 čísla oddelené medzerou - riadok a stĺpec.
Je garantované, že vždy je takáto pozícia práve 1, riešenie je teda vždy jednoznačné.
1 2
1 1
1 2
Vieme byť buď hneď pri počítači, čo nechceme, alebo pôjdeme na druhé políčko a budeme vzdialený 1 od počítača
.X
3 4
1 2
3 4
Najviac sa nám oplatí byť v pravom dolnom rohu - budeme potom vzdialený 4 políčka od počítača
.X..
....
....
Epická miestnosť na matfyze, kde sídli KSP ↩
Priamočiare riešenie, ktoré sa ponúka, je vyskúšať všetky políčka. Pre každé políčko vieme spočítať vzdialenosť, držať si doteraz najvzdialenejšie políčko, ktoré na konci vrátime. To je ale pomalé, presnejšie $O(nm)$ pomalé. Nešlo by to rýchlejšie?
Otázka je, či vlastne naozaj potrebujeme vyskúšať všetky políčka. Rozdeľme si miestnosť na polovicu na výšku aj na šírku.
Pozrime sa na úlohu najskôr v jednom rozmere, tj. miestnosť je veľkosti $1 \cdot m$ (t. j. dlhý slíž), a predpokladajme zatiaľ, že $m$ je párne. Následne si tento slíž rozdeľme na dve polovice. Vidíme, že akonáhle je počítač v ľavej polovici, tak najďalej vieme byť na políčku najviac vpravo a opačne. Ak by sme chceli maximalizovať iba rozdiel tejto súradnice, tak nech je počítač v hocijakom riadku, my chceme ísť do opačnej polovice na kraj.
Rovnakú úvahu vieme spraviť aj pre miestnosť veľkosti $n \cdot 1$ - ak je počítač v hornej polovici, ja chcem byť v dolnej polovici a opačne.
Manhattanská vzdialenosť je súčet dvoch rozdielov - súradníc riadkov a súradníc stĺpcov, a tú chceme maximalizovať. Ak aplikujeme predošlú úvahu, tak vidíme, že chceme maximalizovať tieto rozdiely po zložkách, čo docielime tým, že ideme do opačných polovíc ako počítač. To nám teda dáva 4 možnosti - ak je počítač v ľavej hornej štvrtine, tak, keďže počítač je hore, tak my chceme byť v spodnom riadku, a keďže je v ľavej polovici, tak chceme byť v najpravejšom stĺpci. To spolu dáva výsledné políčko - pravý dolný roh. Rovnaká úvaha sa dá použiť pre zvyšné 3 možnosti - vrátime roh najďalej od počítača, v tomto prípade políčko $(n,m)$.
Program najskôr načíta súradnice $m$, $n$ a súradnice počítača. To, či sme v pravej/ľavej polovici nám určí súradnica počítača určujúca stĺpec. Ak je $\leq \frac{m}{2}$ (pri počítaní súradníc od $(1,1)$ ako ľavý horný roh), tak počítač je v ľavej polovici, inak je v pravej. Obdobne horná/dolná polovica, len s $n$.
Pozorný čitateľ si isto už všimol, že pri nepárnom $n$ alebo $m$ môžeme skončiť presne v strede medzi polovicami. Vtedy by sme mali dve možnosti, v zadaní ale máme garantované, že riešenie je jednoznačné a tento prípad nemôže nastať.
Časová zložitosť je $O(1)$, nakoľko načítanie vstupu je konštatne rýchle, vyhodnotenie polovíc a následného výsledku takisto. Pamäťová zložitosť je tiež $O(1)$, nakoľko si pamätáme iba $m$, $n$ a súradnice počítača.
Korešpondenčný seminár z programovania zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania
Intenzívny programátorský zážitok v lete