3 - Tetke
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
3000ms | 192MB |
U ključnom momentu, kada je trebalo da se pripreme zadaci za SIO, \(N\) članova Komisije je shvatilo da moraju pod hitno da odnesu lek svojim tetkama. Poznato je da se kuća svake tetke nalazi na nekom od polja matrice \(A \times B\), kao i da ne postoji polje na kome su dve kuće.
Kako bi ubedili Potpredsednika Komisije da je njihovo odsustvo opravdano, svi članovi su redom javno objavili na kom polju se nalazi kuća njihove tetke, kao i na kojoj je nadmorskoj visini. Potpredsednik nije od juče, i pažljivo beleži sve što čuje. Pored toga, iako ne zna nadmorske visine svih polja u matrici, on zna da je apsolutna razlika nadmorske visine svaka dva susedna polja u matrici tačno 1 (polja su susedna ako dele stranicu). Imajući to u vidu, on nakon objave svakog člana proba da rekonstruiše celu matricu, tj. da dodeli svakom polju neku nadmorsku visinu, kako bi se uverio da su sve objave bile istinite (ova rekonstrukcija ne mora nužno biti jedinstvena).
Ako nakon objave nekog člana, Potpredsenik po prvi put ne može da odredi visinu svakog polja tako da bude u skladu sa svim dosadašnjim objavama (tj. ne postoji matrica konzistentna sa svim dosadašnjim objavama), jasno je da je taj član lupio glupost. Vaš zadatak je da pronađete prvog člana Komisije koji je lupio glupost.
Opis ulaza
U prvom redu standardnog ulaza nalaze se tri prirodna broja \(N\), \(A\) i \(B\) -- broj članova komisije tj. broj kuća, broj redova matrice i broj kolona matrice. U svakom od narednih \(N\) redova nalaze se tri prirodna broja \(R_i\), \(C_i\) i \(H_i\) koji označavaju red, kolonu i nadmorsku visinu kuće u kojoj živi tetka \(i\)-tog člana Komisije.
Opis izlaza
U prvom i jedinom redu standardnog izlaza ispisati jedan prirodan broj koji predstavlja indeks člana Komisije koji je lupio glupost (članovi su indeksirani počevši od broja \(1\)). Ukoliko takav član ne postoji, ispisati "bravo komisijo" (bez navodnika).
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
U prvom primeru, nakon prve dve objave moguće je odrediti visinu za svako polje tako da se ispoštuju uslovi, npr:
Nakon treće objave, ne postoji način da se to uradi, pa je treći član Komisije lupio glupost.
U drugom primeru, postoji raspored visina koji se uklapa sa svih pet objava, npr:
Ograničenja i podzadaci
- \(1 \leq A, B \leq 10^9\)
- \(1 \leq N \leq 10^5\)
- Za svako \(H_i\) važi \(1 \leq H_i \leq 10^8\)
Postoji \(5\) podzadataka, u kojima dodatno važi:
- Podzadatak 1 [11 poena]: \(B = 1\).
- Podzadatak 2 [11 poena]: \(N \leq 1000\).
- Podzadatak 3 [16 poena]: Za svako \(H_i\) važi \(1 \leq H_i \leq 10\).
- Podzadatak 4 [28 poena]: \(A, B \leq 800\).
- Podzadatak 5 [34 poena]: Bez dodatnih ograničenja.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Nikola Milosavljević | Nikola Jovanović | Nikola Milosavljević | Nikola Milosavljević |
Označimo sa dist(i,j) menhetn rastojanje izmedju i-tog i j-tog polja a sa h[i] visinu i-tog polja.
Lema: Skup od n polja sa visinama u matrici je konzistentan (u smislu da postoji opisana matrica koja sadrži ova polja) ako i samo ako važe sledeća dva uslova (1) Svi parni h[i]-ovi su na poljima čiji je zbir koordinata paran, a svi neparni h[i]-ovi na poljima čiji je zbir koordinata neparan ili obrnuto (2) Za svaka dva polja i i j vazi |h[i] - h[j]| <= dist(i,j)
Ovo su očigledno potrebni uslovi, dok je za obrnut smer dovoljno pokazati da ako ovi uslovi važe, tada za bilo koje polje (x,y) postoji vrednost h koju možemo upisati u njega tako da ova dva uslova važe i za novi skup polja sa ovim poljem (to bi značilo da mozemo da popunimo celu matricu i da važe ova dva uslova, ali onda je ta matrica ok na osnovu primene tih uslova na susedna polja). Ideja dokaza je: u novo poolje (označimo ga sa n+1) možemo upisati konzistentnu vrednost (u smislu (2)) akko je pesek svih segmenata (na realnoj pravoj) [h[i] - dist(i,n+1), h[i] + dist(i,n+1)] neparazn (tada upisujemo odgovarajuću vrednost iz preseka vodeći računa i o (1)) a ovo se pokazuje koristeći već pretpostavljene uslove za prvih n polja i nejednakost trougla.
Uslov (1) se može trivijalno proveravati nezavisno od uslova (2) pa se koncentrišemo isključivo na uslov (2). Nazovimo par polja (i, j) “loš” ukoliko ne zadovoljava uslov (2) tj. ukoliko važi () |h[i] - h[j]| > |x[i] - x[j]| + |y[i] - y[j]| Koristeći oznake Vpp(i) = L[i] + x[i] + y[i], Vpm(i) = h[i] + x[i] - y[i], Vmp(i) = h[i] - x[i] + y[i], Vmm(i) = h[i] - x[i] - y[i] možemo se osloboditi apsolutnih vrednosti iz () razlikovanjem slučajeva. Tačnije, važi:
Za polje i postoji polje j za koje je (i,j) loš par ako i samo ako je tačno bar jedno od sledećih tvrđenja
j je “gore-levo” od i i važi Vmm(i) > Vmm(j) j je “gore-levo” od i i važi Vpp(i) < Vpp(j) … (ukupno 8 slučaja koja zavise od položaja gore/dole-levo/desno i odnosa h[i] i h[j]) Ovo možemo rešavati 2D segmentnim stablom - za svako novo polje postavljamo 8 upita “vrati min/max iz date 2D oblasti” i ubacujemo ga u strukturu posle upita. Međutim, ovde je problem memorijsko ograničenje - čak i implicitno (dinamičko) stablo uz kompresiju koordinata zauzima n * log^2(n) memorije što je praktično nemoguće uklopiti u zadata ograničenja.
Bolji pristup je korišćenje binarne pretrage po rešenju - tada problem postaje “da li postoji loš par među prvih m polja” i više nije bitno da vratimo najmanji indeks tj. da na prethodne upite odgovaramo redom. Koristimo “offline” pristup - sortiramo sva polja npr. po y-koordinati a zatim ih redom ubacujemo u obično segmentno stablo (indeksirano po x-koordinatama) uz upite “min/max na segmentu” (potrebno je 2 puta proći kroz stablo, po jednom u svakom smeru). Vremenska složenost ovog pristupa je O(n * log^2(n)) a memorijska je O(n) i nosi maksimalan broj poena.
Podzadaci uključuju slučajeve kada prolazi rešenje složenosti O(n^2) (što je jedan od načina za “proveru” leme za vreme takmičenja), 1D slučaj (novo polje je dovoljno uporediti sa njegovim susedima), slučajeve u kojima su visine polja mali brojevi (na osnovu (*) za svako polje je dovoljno proveriti samo ona koja su na rastojanju ne većem od MaxH a njih ima O(MaxH^2)) kao i slučaj gde prolazi 2D segmentno.
03_tetke.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
|