A3 - Mingo
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1500ms | 256MB |
Sada, kada je odradio takmičenje, Miroslav je shvatio koliko je programiranje naporno, te je odlučio da pobegne na Mars. On je na internetu naišao na nagradnu igru Mingo u kojoj je glavna nagrada put na Mars.
Nagradna igra se sastoji u tome da svaki takmičar na listiću izabere tačno \(K\) različitih prirodnih brojeva, gde je svaki broj iz skupa \({1, 2, 3, ..., M}\). Nakon toga se vrši \(Q\) izvlačenja, gde svako izvlačenje podrazumeva nasumičan odabir tačno \(K\) različitih brojeva iz prethodno pomenutog skupa. Svaki listić važi za svih \(Q\) izvlačenja, i takmičar koji ima listić sa svim izvučenim brojevima u bilo kom od \(Q\) izvlačenja dobija put na Mars.
Kako bi povećao svoje šanse, Miroslav je popunio \(N\) listića. Kako je sada teško pratiti sve te listiće, on je zamolio vas da mu pomognete.
On želi da za svako izvlačenje u svakom trenutku zna koliko listića ima svaki do tada izvučen broj, tj. za svako izvlačenje posebno, nakon izvučenog \(i\)-tog broja on želi da zna koliko njegovih listića sadrži svaki od izvučenih \(i\) brojeva u tom izvlačenju.
Opis ulaza
U prvoj liniji standardnog ulaza se nalaze brojevi \(N, K\) i \(M\), koji redom označavaju broj listića koje je Miroslav popunio, broj razlitih brojeva koje je potrebno obeležiti na listiću i najveći broj koji je moguće obeležiti. Sledećih \(N\) redova opisije listiće koje je popunio Miroslav, gde se u \(i\)-tom redu nalazi \(K\) brojeva koji označavaju izabrane brojeve na \(i\)-tom listiću. Nakon toga se nalazi jedan red sa brojem \(Q\) koji predstavlja broj izvlačenja. U narednih \(Q\) redova se nalazi opis svih izvlačenja. U \(i\)-tom redu se nalazi \(K\) brojeva koji predstavljaju brojeve u redosledu u kojem su bili izvlačeni.
Opis izlaza
Na standarni izlaz je potrebno ispisati \(Q\) redova, gde \(i\)-ti red odgovara rešenju za \(i\)-to izvlačenje, tj. \(j\)-ti broj u \(i\)-tom redu predstavlja broj listića koji sadrže svaki od izvučenih \(j\) brojeva u \(i\)-tom izvlačenju.
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
U prvom test primeru kod prvog izvlačenja rešenje je "3 2 1" zato što broj 1 Miroslav ima na sva 3 listića. Nakon drugog izvučenog broja imamo kombinaciju "1 4" koja se pojavljuje na 2 listića. Na kraju trećeg izvlačenja imamo kombinaciju brojeva "1 4 11" i jedini listić koji ima sva 3 broja iz kombinacije jeste treći listić te je odgovor 1. U drugom izvlačenju prvog test primera, broj 4 sadrže listići 2 i 3. Dok ne postoje listići koji sadrže sve brojeve iz kombinacija "4 3" i "4 3 13".
Ograničenja
- \(1 \leq N \leq 10000\)
- \(1 \leq K \leq 8\)
- \(K \leq M \leq 500\)
- \(1 \leq Q \leq 20000\)
Test primeri su podeljeni u četiri disjunktne grupe:
- U test primerima koji vrede 15 poena važi \(Q \leq 10\).
- U test primerima koji vrede 15 poena važi \(K = 3, M < 100\).
- U test primerima koji vrede 30 poena važi \(K \leq 5, M < 100\).
- U test primerima koji vrede 40 poena nema dodatnih ograničenja.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Demjan Grubić | Demjan Grubić | Nepoznato | Dušan Zdravković |
Podzadatak \(1\)
Jasno da svaki listić možemo posmatrati kao \(K\)-točlani podskup skupa \(\{1, 2, 3, …., M\}\), te tako imamo ukupno \(N\) podskupova sa po \(K\) elemenata (\(K\)-točlanih). Označimo te podskupove sa \(S_1, S_2, …, S_N\). Za svako pojedinačno izvlačenje i svaki broj \(j\) između 1 i \(K\) potrebno je odrediti koliko ima skupova u nizu \(S_1, S_2, …, S_N\) koji sadrže kao poskup skup sastavljen od prvih \(j\) brojeva izvučenih u tom izvlačenju.
Naivna varijanta se sastoji baš od brojanja koliko ima listića (tj. skupova) kojima je skup sastavljen od prvih \(j\) izvučenih brojeva podskup (tj. koliko ima skupova-listića koji sadrže svih \(j\) prvih izvučenih brojeva). Zavisno od implementacije, složenost ovog rešenja može biti \(O(QNK)\) ili \(O(QNK^2)\).
Svaka od naprednijih varijanti podrazumeva preprocesiranje listića tako da se za svako \(j\in \{1, 2, ..., K\}\) formiraju svi podskupovi sa tačno \(j\) od \(K\) izvučenih brojeva. Zatim se podskupovi iste kardinalnosti (sa istim brojem elemenata) smeštaju u kolekciju koja će omogućiti efikasno određivanje koliko se puta neki podskup (sa istim brojem elemenata) pojavljuje u datoj kolekciji. Primetimo da je broj podskupova sa \(j\) elemenata skupa koji ima \(K\) elemenata jednak \(\binom{K}{j}\). Tako će ukupan broj poskupova sa \(j\) elemenata skupova \(S_1, S_2, …, S_N\) biti \(N\times\binom{K}{j}\). Ukupan broj svih podskupova (za sve vrednosti \(j\)) će biti \(N\times (2^K-1)\).
Podzadatak \(2\)
Elementi skupova (tj. izvučeni brojevi) su brojevi manji od 100. Podskupovi koje izdvajamo imaju najviše 3 elementa i elementi svakog podskupa se mogu sortirati, a zatim posmatrati kao cifre nekog broja u sistemu sa osnovom 100 (budući da su elementi manji od 100). Tako će svaki podskup biti predstavljen kao najviše trocifren broj u sistemu sa osnovom 100, odnosno svaki skup može biti predstavljen pomoću broja koji je manji od milion. Zahvaljujući tome mogu se izbrojati pojavljivanja svakog podskupa i zapamititi u nizu dužine 1000000 (tj. sa milion elemenata).
Podzadatak \(3\)
U podzadatku tri se skupovi opet mogu predstaviti pomoću brojeva u sistemu sa osnovom 100 ali kako u podzadatku 3 broj \(K\) može imati vrednost 5, to će biti najviše potocifreni brojevi i njihova vrednost je ograničena sa 10 milijardi. Ovaj put ne možemo primeniti obično brojanje, već formiramo nizove sa brojevima koji predstavljaju skupove. Nizove možemo sortirati i na kraju jednim prolazom izbrojati broj pojavljivanja svake vrednosti (tj. svakog podskupa). Pri odgovaranju na upite podskup koji se sastoji od \(j\) prvih izvučenih brojeva predstavimo kao broj (na isti način kao i podskupove oformljene od listića) i binarnom pretragom pronalazimo u nizu brojeva koji predstavljaju podskupove listića.
Podzadatak \(4\)
U podzadatku četiri maksimalni broj izvučenih brojeva, kao i maksimalna vrednost izvučenih brojeva su takvi da se podskupovi sa više elemenata ne mogu reprezentovati pomoću celobrojnih tipova podržanih u jezicima koji se koriste za takmičenje. Zbog toga je potrebno podskupove predstaviti na neki drugi način. Jedan od načina je struktura koja sadrži broj elemenata u podskupu i elemente podskupa smeštene u niz koji je sortiran. Nad tako reprezentovanim podskupovima možemo definisati poređenje (uobičajeno leksikografsko poređenje). Koristeći to poređenje možemo sorirati nizove koji sadrže sve podskupove sa istim brojem elemenata. Nakon toga brojanje koliko puta se neki podskup \(P\) pojavljuje u nizu obavljamo varijacijom binarne pretrage u kojoj prvo određujemo deo niza sa podskupovima u kome se prvi element poklapa sa prvim elementom podskupa \(P\), zatim u tako izdvojenom podnizu (određen je početnim i krajnjim elementom podniza) deo u kome se drugi element poklapa sa drugim elementom podskupa \(P\), itd. Postupak prekidamo kada iscrpimo sve elemente podskupa \(P\), nakon čega je broj podskupova jednak dužini izdvojenog podniza, ili kada podniz u kome se elementi mogu poklapati sa podskupom \(P\) postane prazan (tada je odgovor nula).
glavno rešenje
Poslednji podzadatak može biti rešen i tako što se podskupovi smeštaju u heš tabelu, pri čemu u toku dodavanja istovremeno brojimo koliko se puta pojavljuju podskupovi. Nakon toga odgovaranje na upite se svodi na pronalaženje odgovarajućih skupova u heš tabeli i izdvajanju informacije koliko puta se taj podskup nalazi u heš tabeli.
Pokazalo se da maksimum poena može biti osvojen i tako što se svakim izvučenim brojem u jednom konkretnom izvlačenju izdvoje samo listići koji sadrže sve do tog trenutka izvučene brojeve. Broj izdvojenih listića je odgovor za konkretno izvlačenje i konkretan broj izvučenih brojeva. Kada se nakon toga obrađuje sledeći izvučeni broj, analiziraju se samo listići koji su izdvojeni i od njih izdvajaju samo oni koji sadrže izvučeni broj. Uz pažljivu implementaciju dobija se rešenje koje se izvršava u predviđenom vremenu.
06_mingo.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 |
|