B3 - Tiho Brdo
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 64MB |
U srednjevekovnom dobu, u malom gradiću Tihom Brdu živelo je čudovište pod nazivom Gluton, koje je volelo da teroriše stanovnike ovog grada. Mnogi vitezovi su pokušavali da ubiju Glutona, ali ni jedan nije uspeo da preživi taj susret.
Jednog dana, hrabri arhitekta Davis je odlučio da napadne Glutona. Saznao je da se Gluton zapravo sastoji iz gomile delova, koji su međusobno spojeni na taj način da svaki deo može kontrolisati neke druge delove. Gluton ima tačno jedan deo koji predstavlja njegov mozak, i taj deo nije kontrolisan od strane ijednog drugog dela. Takođe, Gluton može imati jedan ili više delova koji ne kontrolišu ni jedan drugi deo; ovi delovi predstavljaju njegove kandže. Za svaku kandžu postoji tačno jedan skup spojeva kojim je mozak (direktno ili indirektno) kontroliše. Ukoliko Davis uspešno odseče mozak od kontrolisanja svih kandži, onda Gluton ostaje potpuno bezopasan.
Davis je upotrebio svoje projektne sposobnosti i zaključio da je svakom od Glutonovih spojeva x → y moguće pripisati snagu w neophodnu da bi se taj spoj uništio. Davisova želja je da uloži minimalno snage za odsecanje mozga od kandži, pa ga zanima koje spojeve, sleva na desno, treba da preseče da bi to postigao. Ukoliko postoji više tačnih rešenja, Davis bi voleo da uložena snaga na početku bude što je manja moguća, tj. traži se leksikografski najmanje rešenje od svih tačnih rešenja.
Za data dva niza, a i b, veličina n i m, kažemo da je a leksikografski manji od b ukoliko ili postoji neka pozicija i tako da je su do te pozicije nizovi isti, a niz a je po i-tom članu manji, tj.
ili se nizovi \(a\) i \(b\) poklapaju na svim kompatibilnim pozicijama, s tim da je niz a kraći, tj.
Primeri: {1, 2, 3} < {2, 2, 3}; {1, 2, 3, 4} < {1, 2, 4, 4}; {1, 2, 3} < {1, 2, 3, 4}. Zaslepljen slavom koju bi stekao i pokličima “Hvala hrabri Davise!” od stanovnika ukoliko bi onesposobio Glutona, Davis nema dovoljno strpljenja da izračuna rešenje. Zamolio vas je za pomoć.
Opis ulaza
U prvom redu standardnog ulaza nalazi se prirodan broj \(n\), koji predstavlja broj Gluto- novih delova. Deo sa indeksom 1 uvek predstavlja mozak. Zatim slede opisi delova, od mozga do dela sa indeksom \(n\), redom, na sledeći način: u prvom redu se nalazi ceo broj \(m_i\), koji predstavlja broj delova koji su pod direktnom kontrolom tekućeg dela. Ukoliko važi \(m_i\) = 0, onda je tekući deo kandža. U suprotnom, u drugom redu se nalazi niz a od \(m_i\) prirodnih brojeva, koji predstavlja, sleva na desno, indekse delova pod direktnom kontrolom tekućeg dela. U trećem redu se nalazi niz \(w\) od \(m_i\) prirodnih brojeva, tako da \(j\)-ti član niza \(w\), \(w_j\) , označava snagu neophodnu za uništenje spoja kojim tekući deo kontroliše \(j\)-tog člana niza \(a\), \(a_j\) .
Opis izlaza
U prvom redu standardnog izlaza potrebno je ispisati minimalnu ukupnu snagu neophodnu da bi Davis onesposobio Glutona. U narednom redu neophodno je ispisati leksikografski najmanji niz snaga koje će trebati Davisu da bi odsekao sve neophodne spojeve, sleva na desno, redom. Članove niza treba odvojiti razmakom.
Primer 1
Ulaz
Izlaz
Objašnjenja primera
Na slikama ispod nalazi se opis test primera; leva slika predstavlja početno stanje Glutona, a desna predstavlja optimalno rešenje. Mozak je označen crnom pozadinom, a kandže crvenom bojom. Precrtani i isprekidani spojevi predstavljaju one spojeve koje Davis treba da uništi. Postoje dva rešenja koja zahtevaju minimalnu ukupnu snagu 11; ta rešenja su, sleva na desno, {4, 7} i {4, 1, 6}. Od ta dva rešenja, biramo leksikografski manje.
Ograničenja
- \(2 ≤ n ≤ 10^5\);
- \(1 ≤ w_j ≤ 10^9\);
- Ukupan broj spojeva će uvek biti \(n − 1\), i uvek će za svaku kandžu postojati tačno jedan skup spojeva koji je povezuju sa mozgom.
Podzadaci i bodovanje
Test primeri su podeljeni u četiri podzadatka, u kojima važe sledeća dodatna ograničenja:
- Podzadatak 1 [10 poena]: Svi spojevi će imati istu potrebnu snagu za uništenje;
- Podzadatak 2 [10 poena]: Jedino mozak može direktno kontrolisati više od jednog dela Glutona;
- Podzadatak 3 [30 poena]: \(n ≤ 1000\);
- Podzadatak 4 [50 poena]: Nema dodatnih ograničenja.
Ukoliko na svim test primerima jednog podzadatka izračunate tačnu ukupnu snagu, dobijate 60% poena za taj podzadatak. Ukoliko korektno odredite leksikografski minimalno rešenje na svim test primerima jednog podzadatka, dobijate 40% poena za taj podzadatak.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Petar Veličković | Petar Veličković | Bogdan Petrović | Andrej Ivašković |
Primetimo da je Gluton stablo sa korenom u čvoru \(1\). Operacija uništenja spoja predstavlja uklanjanje te grane u grafu. Da bismo pobedili Glutona potrebno je ukloniti neke grane tako da koren stabla ne bude povezan ni sa jednim listom. Rešenje zadatka su težine grana sa najmanjom sumom težina koje zadovoljavaju prethodni uslov. Ukoliko postoji više rešenja, potrebno je ispisati leksikografski najmanje. Više o tome u analizi po podzadacima.
Prvi podzadatak
Pošto svi spojevi imaju istu potrebnu snagu za uništenje, do rešenja dolazimo brisanjem minimalnog broja grana u grafu tako da koren ne bude povezan sa listovima. To najjednostavnije postižemo brisanjem svih grana koje povezuju koren stabla sa njegovom decom. Neka je \(d = deg(1)\) i \(w\) težina grane, potrebno je ispisati \(d\cdot w\), a zatim \(d\) puta ispisati \(w\). Vremenska i memorijska složenost je \(O(N)\).
Drugi podzadatak
Primetimo da stablo u ovom podzadatku izgleda kao \(deg(1)\) lanaca kojima je čvor \(1\) jedan od krajeva. U ovakvom stablu imamo \(deg(1)\) listova, po jedan u svakom lancu. Da bismo prekinuli vezu između lista i korena potrebno je da uklonimo granu na putu od tog lista do korena, odnosno potrebno je ukloniti granu na svakom lancu. Do rešenja dolazimo uklanjanjem grane sa najmanjom težinom iz svakog lanca. Vremenska i memorijska složenost je \(O(N)\).
Treći podzadatak
Označimo sa \(s_i\) minimalnu sumu težina grana koje treba da uklonimo iz podstabla čvora \(i\) tako da čvor \(i\) ne bude povezan sa listovima svog podstabla, i sa \(k_i\) neku strukturu koja čuva pojedinačne težine tih grana. Da bismo izračunali vrednosti \(s_i\) i \(k_i\), koristićemo vrednosti \(s_j\) i \(k_j\), za svako \(j\) čiji je roditelj čvor \(i\).
U \(k_i\) ćemo dodati \(w_{i,j}\) ukoliko je \(w_{i,j}<s_j\), u suprotnom dodajemo \(k_j\). Napomena: bitno je da je \(w_{i,j}<s_j\), a ne \(w_{i,j}≤s_j\) u gornjem uslovu da bismo ispunili uslov zadatka koji nam traži leksikografsku minimalnost. Za listove ćemo postaviti vrednost \(s\) na \(\infty\), jer je nemoguće da izbrišemo neke grane tako da razdvojimo taj čvor od samog sebe. Rešenje zadatka su \(s_1\) i \(k_1\). Ovaj način je moguće implementirati algoritmom pretrage u dubinu, naivnim pozivanjem funkcije pretrage u dubinu. Vremenska složenost je \(O(N^2)\) , a memorijska \(O(N)\), jer se težina svake grane čuva na najviše \(2\) mesta, u \(k_i\) i \(k_j\).
Glavno rešenje
Koristićemo slično rešenje kao u prethodnom podzadatku. Jedina razlika je što ćemo koristiti memoizaciju kao tehniku da ubrzamo pretragu u dubinu, tj. da za svaki čvor \(i\) računamo vrednosti \(s_i\) i \(k_i\) jedanput. Vremenska i memorijska složenost je \(O(N)\).
03_tiho_brdo.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 |
|