5 - Zlatnici 3
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
800ms | 256MB |
Savez Čarobnjačkih Bankara (SČB) ima mrežu banaka povezanih portalima, tačnije minimalnim brojem portala potrebnih da se od svake banke može doći u svaku drugu banku (portali su skupi za održavanje, pa graf banaka predstavlja stablo), u kojima čuvaju zlatnike. Pomoću ovih portala mogu slati zlatnike iz jedne banke do druge, portalom koji ih povezuje, ali za jedno prebacivanje jednog zlatnika kroz jedan portal, potreban im je jedan kristal timpestina, retkog minerala, koji se koristi kao gorivo za ovaj proces. Savez želi u svakom trenutku da bude spreman za nepredviđene okolnosti, i to na sledeći način: plan je da se u slučaju uzbune svi zlatnici prebace u jednu banku, kako bi se svi čarobnjaci ujedinili u njihovoj zaštiti. Pri tome želimo da ovo uradimo tako da potrošimo najmanje kristala timpestina, sa obzirom da je on jako dragocen. Kako su ovi bankari čarobnjaci, a ne programeri, i kako ljudi stalno dolaze i stavljaju novac u banku, oni ne umeju dovoljno brzo da izračunaju u koju banku bi trebalo prebaciti sve zlatnike u slučaju uzbune. Pomozite im i odredite u koju banku je najbolje prebaciti sve resurse u bilo kom trenutku!
Opis ulaza
U prvom redu standardnog ulaza nalazi broj \(N\), broj banaka. U narednih \(N-1\) redova se nalaze po dva cela broja \(x_i\) i \(y_i\), u opsegu od \(1\) do \(N\), koji predstavljaju povezanost banke \(x_i\) i \(y_i\) portalom. U sledećem redu nalazi se \(N\) brojeva, početni broj zlatnika u svakoj banci. U narednom redu se nalazi \(Q\), broj upita. U sledećih \(Q\) redova nalaze se po dva broja \(z_i\) i \(b_i\), koji predstavljaju dolazak osobe koja stavlja \(z_i\) zlatnika u banku \(b_i\).
Opis izlaza
Ispisati \(Q+1\) brojeva. Prvi broj je optimalna banka u koju treba prebaciti sve zlatnike ako dođe do uzbune pre dolaska prvog čoveka koji prilaže novac, dok su narednih \(Q\) brojeva indeksi optimalnih banaka nakon dolazaka svakog od zalagača redom, to jest nakon svakog od upita. Ako ima više optimalnih banaka, ispisati onu sa najmanjim indeksom.
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
Prvi primer:
- Pre dolaska prvog čoveka banka \(3\) je optimalna i trebalo bi nam \(6\) kristala da sve zlatnike prebacimo u nju.
- Nakon dolaska prvog čoveka banka \(5\) postaje optimalna, i trebalo bi nam \(10\) kristala da sve zlatnike prebacimo u nju.
- Nakon dolaska drugog čoveka banka \(4\) postaje optimalna, i treba nam \(15\) kristala ako želimo da prebacimo sve zlatnike u nju.
Drugi primer:
- Pošto u poslednjoj banci ima ubedljivo najviše zlatnika, jasno je da je neisplativo da ih premeštamo iz nje.
Ograničenja
- \(1 \leq N,Q \leq200.000\), početni broj zlatnika u svakoj banci je bar 1.
Test primeri su podeljeni u pet disjunktnih grupa:
- U testovima vrednim 15 poena: \(N \leq 1000, Q=0\).
- U testovima vrednim 15 poena: \(Q=0\).
- U testovima vrednim 20 poena: Svaka banka je povezana sa najviše dve druge banke.
- U testovima vrednim 20 poena: Graf banaka predstavlja kompletno binarno stablo.
- U testovima vrednim 30 poena: Bez dodatnih ograničenja.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Pavle Martinović | Marko Šišović | Pavle Martinović | Pavle Martinović |
Rešenje u \(O(QN^2)\)
Pokušajmo da pronađemo za svaki čvor \(u\) koliko treba poteza da bismo sve zlatnike preneli u njega. Ovo je suma \(\sum_{i=1}^nd(u,i)\cdot w_i\), gde \(w_i\) broj zlatnika u \(i\), a \(d(u,v)\) dužina puta između čvorova \(u\) i \(v\). Ovo se lako može izračunati puštanjem DFS iz svakog čvora.
Rešenje u \(O(QN)\)
Potrebno je da malo dublje analiziramo koji čvor će biti odgovor. Neka sa \(V_v\) označavamo broj poteza koji je potreban da bi svi zlatnici stigli u čvor \(v\). Potrebno je naći čvor tako da je \(V_u=\sum_{i=1}^nd(u,i)\cdot w_i\) minimalno. Posmatrajmo vrednost \(V_u-V_v\) za neku granu \(uv\). Iz gorenavedene formule vidimo da je ovo zapravo jednako razlici suma težina u dva stabla koja dobijemo kada isečemo granu \(uv\) (uverite se!). Kada smo u optimalnom čvoru, ova vrednost treba da bude negativna za sve grane, što je ekvivalentno sa tim da kad isečemo taj čvor, u svakom od dobijenih stabala je najviše pola od ukupne težine (ovakav čvor se zove centroidom stabla). Sada lako se vidi da je ovakav čvor jedinstven, ili ih je dva koja su spojena granom sa razlikom renjenja od \(0\) (a u tom slulaju su oba validno rešenje). Stoga, sveli smo zadatak na traženje šta je centroid u ovom stablu, što može da se uradi DFS i čuvaju se veličine svih podstabala, a zatim se uradi jednostavna provera.
Rešenje kada je stablo put
U ovom slučaju je rešenje ternarno pretraživo po putu, i sve dist funkcije se mogu izračunati lako. Moguće je uraditi tad u zadatak \(O(N\log N + Q\log^2 N)\), za jednu tačku pretrage u ternarnoj nam treba samo sume po prefiksima i sufiksima, a promeni tih možemo da pratimo u segmentnom stablu.
Rešenje kada je stablo kompletno binarno
Nastavljamo na rešenje iz drugog podzadatka. Ono što treba primetiti je da je vrednost \(V_v-V_u\) moguće izračunati brzo za neku granu. Zaista ako smestimo čvorove u niz po ulaznom ili izlaznom poretku DFS, i imamo segmentno stablo nad tim nizom, pošto će svi čvorovi u nekom stablu formirati interval. Nama je potrebna samo težina u dva stabla koja dobihemo kad isečemo ovu granu, a jedno od tih stabala će morati da bude podtablo ukorenjenog stabla. Težinu u drugom možemo izračunati kao ukupna težina minus to što smo izračunali. Stoga, promenu rezultata prolaskom iz jednog čvora u drugi, (to jest da li je bolje ako pređemo) možemo izračunati u \(O(\log N)\).
Sada kad dodamo novi čvor, novo rešenje će se nalaziti na putu od trenutnog rešenja do tog novog na koji smo dodali zlatnike. Stoga, na tom putu će promene rezultata biti pozitivne, pa negativne. Da bismo rešili zadatak potrebno je samo iterirati kroz put i naći sve grane kroz koje kad prođemo poboljšavamo rezultat. Pošto su na ovom stablu svi putevi kratki, nalazimo rešenje u \(O(N\log N + Q\log^2 N)\).
Glavno rešenje
Konačno rešenje je mala nadogradnja prethodnog. Naime, umesto da idemo redom po putu između starog i novog čvora, uraidmo binarnu pretragu na tom putu da bismo pronašli poslednju granu koja nam daje pozitivan skor na rezultat. Po svemu opisanom u prethodnom podzadatku, ovo će zaista biti binarno pretraživo i stoga će ovo rešenje raditi u \(O(N\log N + Q\log^2 N)\).
05_zlatnici3.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 |
|