Skip to content

Commit 40613fe

Browse files
committed
Add code links
1 parent 62ce717 commit 40613fe

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

contests/_37-PDP/b-tiphunting-solution.md

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,6 @@ layout: solution
33
codename: 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

Comments
 (0)