Editorial for Planine
Submitting an official solution before solving the problem yourself is a bannable offence.
Analiza
Potrebno je u kvadratnoj matrici pronaći element koji je strogo najveći u svojoj vrsti i strogo najmanji u svojoj koloni -- nazovimo takav element (ukoliko postoji) sedlo (to je, inače, standarni termin). Za početak primetimo da ukoliko sedlo postoji, onda je jedinstveno; zaista, pretpostavimo da su i sedla. Očigledno, i . Ukoliko je , tada, zbog definicije sedla, što je kontradikcija; za ponovo dobijamo kontradikciju preko pa je nemoguće da postoje dva ili više sedla.
Iz prethodnog razmatranja sledi: ukoliko su nam poznate vrednosti neka dva polja (npr. i ), možemo eliminasti bar jedno od njih kao potencijalnog kandidata za sedlo upitom nad najviše jednim dodatnim poljem ( ili ). Dakle, proizvoljnih potencijalnih kandidata za sedlo (za koje znamo vrednosti) možemo svesti na samo uz ne više od pitanja koriteći ovaj metod koji ćemo jednostavno zvati Eliminacija.
Podzadaci 1 i 2: Ovde je pa jednostavno možemo pitati za vrednosti svih polja i naći sedlo u poznatoj matrici u složenosti ukoliko za svako polje prolazimo celu njegovu vrstu i kolonu ili u složenosti ukoliko prekalkulišemo maksimume po vrstama i minimume po kolonama.
Podzadatak 3: Kako su vrednosti iz skupa , jasno je da element može biti sedlo ako i samo ako je , svi ostali elementi u njegovoj vrsti su i svi ostali elementi u njegovoj koloni su . Prema tome, ukoliko upitamo za vrednost i dobijemo vrednost , eliminisali smo celu -tu kolonu (tamo ne može biti sedlo), ako dobijemo vrednost -- eliminisali smo celu -tu vrstu, a ako dobijemo vrednost - eliminisali smo celu -tu vrstu i -tu kolonu osim potencijalno baš elementa . Upite možemo postavljati tako da u svakom upitu eliminišemo bar jednu vrstu ili kolonu pa ćemo nakon najviše upita eliminisati sve vrste i kolone i ostaće nam najviše polja koja mogu biti potencijalna sedla. Sada primenimo Eliminaciju (najviše još upita) i još najviše upita za proveru da li je preostali element zaista sedlo (može se pokazati da je za ovaj metod gornja granica za broj upita zapravo umesto ).
Podzadatak 4: Postavimo upite za sve elemente sa glavne dijagonale i permutujmo vrste i kolone tako da važi (ovo nije problem, dovoljno je samo zapamtiti te permutacije i za svako naredno zapravo postavljati ). U novodobijenoj matrici, nijedan element ispod glavne dijagonale ne može biti sedlo (nemoguće da za važi i jer ) pa sedlo možemo tražiti samo na glavnoj dijagonali i iznad, pitajući za vrednosti sve kandidate (njih ) i primenjujući Eliminaciju (pokazati da nam prilikom Eliminacije nikada neće trebati vrednosti elemenata ispod glavne dijagonale jer možemo koristiti poredak na njoj!). Ovaj deo možemo i jednostavnije, nalazeći sedlo kao u Podzadatku 2 ne koristeći elemente ispod glavne dijagonale (pokazati da ćemo i u slučaju "polu-matrice" sa soritranom dijagonalom dobiti najviše jednog kandidata!). Kada dobijemo jedinstvenog kandidata, dovoljno je još upita za proveru jer je najviše toliko polja iz njegove vrste i kolone (od njih ) ispod glavne dijagonale. Dakle, treba nam upita, što se uklapa u ograničenja.
Podzadatak 5: U prethodnom podzadatku, umesto da pitamo za sva polja iznad glavne dijagonale, možemo npr. rekurzivno primeniti logiku za gornji-desni kvadrat (i opet pitati samo oko polovinu svih elemenata u njemu). Preciznije, radimo sledeće
- Ukoliko je trenutni kvadrat dimenzija pitamo i vratimo to polje kao potencijalnog kandidata; inače
- Pitamo za sve elemente glavne dijagonale trenutnog kvadrata i permutujemo vrste/kolone tako da važi poredak kao u prethodnom podzadatku
- Rekurzivno ponovimo postupak za gornji-levi, donji-desni i gornji-desni podkvadrat (za prva dva postavimo marker da ne moramo pitati/sortirati dijagonalu jer je već sortirana kao deo originalne) i od 3 dobijena kandidata Eliminacijom vratimo samo jedan.
Ako je broj poziva ovog algoritma za kvadrat dimenzije , nije teško zaključiti da važi i za (kako ima puno "preklapanja" dijagonala, možemo zamisliti da zapravo ne pitamo za polja osim ako je kvadrat ) pa je (polja koja pitamo obrazuju neku vrstu fraktala a implementacija je blago zgodnija jer je stepen dvojke). Za Eliminaciju nam u najgorem slučaju treba još toliko upita (a u praksi mnogo manje zbog preklapanja) i računajući konačnu proveru to je najviše upita, što se uklapa u ograničenja.
Podzadaci 6 i 7: Nazovimo skup polja (matrice) dobrim ukoliko nikoja dva polja iz nisu u istoj vrsti ili koloni i ukoliko se sedlo (ukoliko postoji) cele matrice nalazi u preseku vrste u kojoj je neki element iz i kolone u kojoj je neki element iz . Npr. jedan dobar skup je .
Primetimo da ako je dobar skup, tada sedlo ne sme biti veće od najvećeg elementa iz i ne sme biti manje od najmanjeg elementa iz . Zaista, kako sedlo pripada nekoj koloni iz , ono je manje ili jednako od bar jednog elementa iz pa i od maksimuma; slično i za minimum.
Neka je proizvoljan dobar skup i neka je takvo da je najmanja vrednost od svih vrednosti iz a takvo da je najveća vrednost od svih vrednosti iz . Od dobrog skupa možemo dobiti dobar skup sa jednim elementom manje na sledeći način: pitamo za vrednost elementa i razlikujemo 3 slučaja:
- : Ako je sedlo u koloni onda je ono manje od a samim tim i od tj. od svih elemenata skupa što je nemoguće zbog . Dakle, u koloni nema sedla. Sa druge strane, u vrsti je jedini kandidat za sedlo (inače bi sedlo moralo biti veće od svih elemenata iz što je nemoguće zbog ) ali već smo zaključili da u koloni nema sedla pa sedlo nije ni u vrsti . Dakle, izbacivanjem elementa iz opet dobijamo dobar skup.
- : Analognim razmatranjem kao u prethodnom slučaju, dobijamo da se izbacivanjem elementa iz opet dobija dobar skup.
- : Koristeći kao u prethodnim slučajevima, dobijamo da je jedini kandidat za sedlo u koloni i da je jedini kandidat za sedlo u vrsti . Međutim, i ne mogu biti sedla zbog, redom, i pa sledi da sedlo nije ni u vrsti ni u koloni . Ovu vrstu i kolonu možemo izbaciti tako što iz skupa izbacimo elemente i ali ubacimo element (jer moramo zadržati -tu vrstu i -tu kolonu). Novodobijeni skup je dobar i sadrži element manje.
Kada dobijemo dobar skup sa jednim elementom, on je jedini kandidat za sedlo. Dakle, algoritam je sledeći: krenemo od npr. dobrog skupa sa dijagonalnim elementima (N upita), svedemo ga na dobar skup sa jednim elementom pomoću dodatnih upita i na kraju potrošimo još najviše upita za proveru. U zavisnosti da li minimum/maksimum u svakom koraku tražimo u (trivijalno) ili u (uz pomoć neke strukture), ovo prolazi za prvih 6 ili za svih 7 podzadataka.
Rešenje sa očekivanim brojem upita reda : Primetimo da ukoliko znamo vrednosti neka dva polja (npr. i ) možemo eliminisati bar jedno od polja kao potencijalnog kandidata za sedlo bez ikakvih dodatnih upita (npr. ako je , možemo zaključiti da ne može biti sedlo iako mu možda ne znamo vrednost). Prema tome, ukoliko smo postavili upita, teoretski možemo eliminisati polja gledajući svaki par upita. Naravno, ovde može doći do puno preklapanja (različiti parovi upita eliminišu isto polje) ali se može pokazati (a i intuitivno je jasno) da je očekivani broj upita (ako ih postavljamo random) potreban za eliminaciju svih polja (osim eventualno jednog) reda veličine . Dodatno, upiti ne moraju biti postavljani bilo kako već u svakom koraku pitati samo neko trenutno ne-eliminisano polje (i pomoću njega i prethodnih upita raditi pomenutu elminaciju); ukoliko ostane ne-eliminisanih polja u nekom trenutku, možda je bolje prebaciti se na standardnu Eliminaciju itd.
Ovaj pristup, uz eventualnu randomizaciju ili bolje odabrani redosled upita, prolazi za Podzadatke 1, 2, 4 i 5 a često i za 3 (zbog specifičnih vrednosti i malo veće konstante za dozvoljeni broj upita u odnosu na Podzadatke 6 i 7). Sa druge strane ovo (verovatno) ne može rešiti Podzadatak 6 (zbog strožeg ograničenja u broju upita i eventualno memorijskog ograničenja) kao ni Podzadatak 7 (jer je složenost ).
Comments