@@ -3,18 +3,6 @@ layout: solution
33codename : tiphunting
44---
55
6- <!--
7- Change log:
8- 0. Typos
9- 1. Έγραψα την επεξήγηση της εκφώνησης από την αρχή.
10- 2. Αφαίρεσα όλες τις αναφορές που είχα στον Τάκη για να κρατήσω τη λύση
11- ανεξάρτητη από την ιστορία της εκφώνησης, αλλά και γιατί κατάλαβα ότι,
12- technically, ο διανομέας του Τάκη είναι αυτός που θα ακολουθήσει
13- τη διαδρομή, όχι ο ίδιος ο Τάκης :)
14- 3. Άλλαξα τα L_i, R_i σε L, R ώστε ο συμβολισμός να είναι απλούστερος.
15- 4. parent[u] -> parent(u)
16- -->
17-
186## Επεξήγηση Εκφώνησης
197
208Μας δίνεται η περιγραφή ενός οδικού δικτύου μιας πόλης με $$ N $$ σπίτια που
@@ -51,6 +39,9 @@ _διαδρομή_ ορίζουμε μια πεπερασμένη ακολουθ
5139Η απάντηση λοιπόν σε κάθε ερώτημα είναι η ίδια και ίση με το συνολικό
5240άθροισμα $$ S = \sum_{i = 1}^N t_i $$ των φιλοδωρημάτων.
5341
42+ Δείτε ολόκληρο τον κώδικα [ εδώ] ({% include link_to_source.md
43+ solution_name='subtask1.cc' %})
44+
5445## Γενικές Παρατηρήσεις
5546
5647Πριν προχωρήσουμε, ας παρατηρήσουμε κάποιες ιδιότητες της βέλτιστης λύσης που
@@ -103,16 +94,17 @@ $$u$$.
10394Διαφορετικά η επιλογή 2 είναι καλύτερη --- ή ισοδύναμη σε περίπτωση μηδενικού
10495κέρδους.
10596
106-
10797Μπορούμε να υπολογίσουμε όλες τις τιμές $$ \text{subtree\_loop\_opt} $$
108- αναδρομικά εφαρμόζοντας τον παρακάτω τύπο:
98+ εφαρμόζοντας τον παρακάτω αναδρομικό τύπο:
10999
110100$$ \text{subtree\_ loop\_ opt}[u] = t_u + \sum_{v \in \text{children}(u)}
111101\left( \text{subtree\_loop\_opt}[v] - 2 \cdot w_{u, v} \right)^+ $$
112102
113103όπου ο συμβολισμός $$ (x)^+ $$ σημαίνει $$ \max(0, x) $$ και $$ \text{children}(u) $$
114104είναι το σύνολο με όλα τα παιδιά της κορυφής $$ u $$ .
115105
106+ {% include code.md solution_name='subtask2.cc' start=16 end=30 %}
107+
116108Η τελική απάντηση στο ερώτημα βρίσκεται στο $$ \text{subree\_loop\_opt}[L] $$ .
117109
118110Για τον υπολογισμό όλων των παραπάνω τιμών, χρειάζεται για κάθε κορυφή να
@@ -122,6 +114,9 @@ $$ \text{subtree\_loop\_opt}[u] = t_u + \sum_{v \in \text{children}(u)}
122114πολυπλοκότητα $$ \mathcal{O}(N Q) $$ , η οποία μας καλύπτει για τους περιορισμούς
123115αυτού του υποπροβλήματος.
124116
117+ Η πλήρης κώδικας βρίσκεται [ εδώ] ({% include link_to_source.md
118+ solution_name='subtask2.cc' %})
119+
125120## Υποπρόβλημα 3 ($$ N \le 1.000, Q \le 1.000 $$ ) --- Λύση $$ \mathcal{O}(N Q) $$
126121
127122Ας σκεφτόυμε τώρα την πιο γενική περίπτωση όπου η διαδρομή μας θα πρέπει να
@@ -176,11 +171,17 @@ $$\text{supertree\_root\_opt}$$ για τον γονέα $$\text{parent(u)}$$ τ
176171όταν αυτή έχει θετικό πρόσημο. Τέλος, σε κάθε περίπτωση, συμπεριλαμβάνουμε και
177172το κόστος διάσχισης του δρόμου $$ (u, \text{parent}[u]) $$ ακριβώς μία φορά.
178173
174+ Μια αναδρομική υλοποίηση είναι η παρακάτω:
175+
176+ {% include code.md solution_name='subtask3.cc' start=17 end=52 %}
177+
179178Για την επίλυση ενός ερωτήματος λοιπόν χρειάστηκαν _ δύο διασχίσεις_ του δέντρου
180179(μια για τον υπολογισμό των $$ \text{subtree\_loop\_opt} $$ , και έπειτα μια για
181180τον υπολογισμό των $$ \text{supertree\_root\_opt} $$ ), οι οποίες γίνονται σε
182181$$ \mathcal{O}(N) $$ χρόνο. Συνολικά $$ \mathcal{O}(N \cdot Q) $$ πολυπλοκότητα
183182και γι' αυτό το υποπρόβλημα.
183+ Μπορείτε να δείτε ολόκληρο των κώδικα [ εδώ] ({% include link_to_source.md
184+ solution_name='subtask3.cc' %}).
184185
185186## Υποπρόβλημα 4 ($$ L = R $$ ) --- Λύση $$ \mathcal{O}(N + Q) $$
186187
@@ -230,6 +231,8 @@ $$\text{supertree\_loop\_opt}$$ με ρίζα την κορυφή 1 μπορεί
230231$$ \text{subtree\_loop\_opt}[L] + \text{supertree\_loop\_opt}[L]. $$
231232
232233Συνολικά η λύση αυτή έχει χρονική πολυπλοκότητα $$ \mathcal{O}(N + Q) $$ .
234+ Μπορείτε να δείτε ολόκληρο των κώδικα [ εδώ] ({% include link_to_source.md
235+ solution_name='subtask4.cc' %}).
233236
234237## Υποπρόβλημα 5 ($$ L_1 = L_2 = \ldots = L_N $$ ) --- Λύση $$ \mathcal{O}(Ν + Q) $$
235238
@@ -239,10 +242,12 @@ $$ \text{subtree\_loop\_opt}[L] + \text{supertree\_loop\_opt}[L]. $$
239242και να εφαρμόσουμε τη λύση του υποπροβλήματος 3, υπολογίζοντας όμως
240243τις βοηθητικές τιμές $$ \text{subtree\_loop\_opt} $$ και $$ \text{supertree\_root\_opt} $$
241244μόνο μια φορά στην αρχή, και απαντώντας μετά το κάθε ερώτημα σε σταθερό χρόνο.
245+ Ο πλήρης κώδικας βρίσκεται [ εδώ] ({% include link_to_source.md
246+ solution_name='subtask5.cc' %}).
242247
243- ** Σημείωση** : Στο υποπρόβλημα 3 θεωρήσαμε ότι η ρίζα ήταν το $$ R $$ , όμως λόγω
244- συμμετρίας του προβλήματος, θα μπορούσαμε να είχαμε θεωρήσει ως ρίζα το $$ L $$ όπως
245- κάνουμε σε αυτό το υποπρόβλημα .
248+ ** Σημείωση** : Στο υποπρόβλημα 3 θεωρήσαμε ότι η ρίζα ήταν το σπίτι $$ R $$ , όχι
249+ το $$ L $$ όπως εδώ. Η Παρατήρηση 3 όμως μας εξασφαλίζει ότι αυτή η αλλαγή
250+ δεν επηρεάζει την απάντηση .
246251
247252## Υποπρόβλημα 6
248253
@@ -344,7 +349,8 @@ $$ \text{subtree\_loop\_opt}[L] + \text{supertree\_loop\_opt}[L]. $$
344349κάνει κατάλληλη προεργασία σε χρόνο $$ \mathcal{O}(N \log N) $$ μια φορά στην
345350αρχή. Προτείνουμε να ανατρέξετε
346351[ εδώ] ( https://cp-algorithms.com/graph/lca_binary_lifting.html ) για μια
347- αναλυτική περιγραφή, ή δείτε τα σχόλια στην παρακάτω υλοποίηση.
352+ αναλυτική περιγραφή, ή δείτε τα σχόλια στον κώδικα της λύσης
353+ [ εδώ] ({% include link_to_source.md solution_name='optimal.cc' %}).
348354
349355Η λύση που περιγράψαμε έχει συνολική πολυπλοκότητα $$\mathcal{O}
350356( (N + Q) \log N )$$ η οποία μας καλύπτει για τους περιορισμούς
0 commit comments