Skip to content

Commit 18fd446

Browse files
committed
Rename vectors
1 parent 0873098 commit 18fd446

File tree

6 files changed

+198
-190
lines changed

6 files changed

+198
-190
lines changed

_includes/source_code/code/37-PDP/tiphunting/optimal.cc

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using vvl = vector<vector<long>>;
1414
vvll tree;
1515
vl tip, depth, parent, parent_weight;
1616
vvl pred;
17-
vector<long long> subtree_loop_opt, supertree_loop_opt, supertree_root_opt;
17+
vector<long long> best_subtree_tour, best_supertree_tour, best_supertree_root_walk;
1818

1919
long long positive_part(long long x) { return max(0LL, x); }
2020

@@ -34,21 +34,20 @@ void init(int n) {
3434
parent_weight.resize(n, 0);
3535

3636
pred.resize(kMaxH, vector<long>(n));
37-
subtree_loop_opt.resize(n);
38-
supertree_loop_opt.resize(n);
39-
supertree_root_opt.resize(n);
37+
best_subtree_tour.resize(n);
38+
best_supertree_tour.resize(n);
39+
best_supertree_root_walk.resize(n);
4040
}
4141

4242
// Διασχίζει το δέντρο `tree` ξεκινώντας από την κορυφή `u` και υπολογίζει
4343
// αναδρομικά τις τιμές `depth[v]`, `parent[v]` και `parent_weight[v]` για κάθε
4444
// κορυφή `v != u` στο υποδέντρο της `u`. Οι τιμές `depth[u]`, `parent[u]` και
4545
// `parent_weight[u]` θα πρέπει να έχουν ήδη υπολογισθεί από τον caller.
4646
//
47-
// `depth[u]`: Το βάθος του `u` στο δέντρο, το οποίο ορίζεται ως το πλήθος
48-
// των ακμών στο μονοπάτι από τον `u` προς τη ρίζα. Για παράδειγμα το βάθος
49-
// της ρίζας είναι 0.
50-
// `parent[u]`: Ο γονέας του `u`.
51-
// `parent_weight[u]`: Κόστος του δρόμου που συνδέει τον `u` με τον γονέα του.
47+
// `depth[u]`: Το βάθος του `u` στο δέντρο, το οποίο ορίζεται ως το πλήθος των
48+
// ακμών στο μονοπάτι από τον `u` προς τη ρίζα. Για παράδειγμα το βάθος της
49+
// ρίζας είναι 0. `parent[u]`: Ο γονέας του `u`. `parent_weight[u]`: Κόστος
50+
// του δρόμου που συνδέει τον `u` με τον γονέα του.
5251
void compute_auxiliary(int u) {
5352
for (auto [v, w]: tree[u]) {
5453
if (v == parent[u]) continue;
@@ -61,65 +60,65 @@ void compute_auxiliary(int u) {
6160
}
6261

6362
// Διασχίζει το δέντρο `tree` και υπολογίζει αναδρομικά τις τιμές
64-
// `subtree_loop_opt` για την κορυφή `u` κι όλους τους απογόνους της.
63+
// `best_subtree_tour` για την κορυφή `u` κι όλους τους απογόνους της.
6564
//
66-
// `subtree_loop_opt[u]`: Το κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
67-
// και καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει
68-
// η κορυφή `u`. Mε άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει
69-
// τον δρόμο `(u, parent)`.
70-
void compute_subtree_loop_opt(long u) {
71-
subtree_loop_opt[u] = tip[u];
65+
// `best_subtree_tour[u]`: Το κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
66+
// και καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει η
67+
// κορυφή `u`. Mε άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει τον δρόμο
68+
// `(u, parent)`.
69+
void compute_best_subtree_tour(long u) {
70+
best_subtree_tour[u] = tip[u];
7271

7372
for (auto [v, w]: tree[u]) {
7473
if (v == parent[u]) continue;
75-
compute_subtree_loop_opt(v);
76-
subtree_loop_opt[u] += positive_part(subtree_loop_opt[v] - 2*w);
74+
compute_best_subtree_tour(v);
75+
best_subtree_tour[u] += positive_part(best_subtree_tour[v] - 2*w);
7776
}
7877
}
7978

8079
// Διασχίζει το δέντρο `tree` και υπολογίζει αναδρομικά τις τιμές
8180
// `subtree_root_opt` για την κορυφή `u` κι όλους τους απογόνους της,
82-
// χρησιμοποιώντας τις τιμές `subtree_loop_opt` που υπολογίσαμε ήδη στην
81+
// χρησιμοποιώντας τις τιμές `best_subtree_tour` που υπολογίσαμε ήδη στην
8382
// προηγούμενη διάσχιση.
8483
//
85-
// `supertree_root_opt[u]`: Το κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
86-
// από την κορυφή `u`, καταλήγει στη ρίζα του δέντρου και
87-
// μένει πάντα ΕΚΤΟΣ του υποδέντρου που ορίζει η `u`. Το φιλοδώρημα της κορυφής
88-
// `u` ΔΕΝ προσμετράται.
89-
void compute_supertree_root_opt(long u) {
90-
supertree_root_opt[u] = 0;
84+
// `best_supertree_root_walk[u]`: Το κέρδος της βέλτιστης διαδρομής η οποία
85+
// ξεκινάει από την κορυφή `u`, καταλήγει στη ρίζα του δέντρου και μένει πάντα
86+
// ΕΚΤΟΣ του υποδέντρου που ορίζει η `u`. Το φιλοδώρημα της κορυφής `u` ΔΕΝ
87+
// προσμετράται.
88+
void compute_best_supertree_root_walk(long u) {
89+
best_supertree_root_walk[u] = 0;
9190

9291
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
9392
if (parent[u] != u)
94-
supertree_root_opt[u] =
95-
subtree_loop_opt[parent[u]] + supertree_root_opt[parent[u]]
96-
- positive_part(subtree_loop_opt[u] - 2*parent_weight[u]) - parent_weight[u];
93+
best_supertree_root_walk[u] =
94+
best_subtree_tour[parent[u]] + best_supertree_root_walk[parent[u]]
95+
- positive_part(best_subtree_tour[u] - 2*parent_weight[u]) - parent_weight[u];
9796

9897
for (auto [v, w]: tree[u])
9998
if (v != parent[u])
100-
compute_supertree_root_opt(v);
99+
compute_best_supertree_root_walk(v);
101100
}
102101

103102
// Διασχίζει το δέντρο `tree` και υπολογίζει αναδρομικά τις τιμές
104-
// `subtree_loop_opt` για την κορυφή `u` κι όλους τους απογόνους της,
105-
// χρησιμοποιώντας τις τιμές `subtree_loop_opt` που υπολογίσαμε ήδη στην
103+
// `best_subtree_tour` για την κορυφή `u` κι όλους τους απογόνους της,
104+
// χρησιμοποιώντας τις τιμές `best_subtree_tour` που υπολογίσαμε ήδη στην
106105
// προηγούμενη διάσχιση.
107106
//
108-
// supertree_loop_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει αλλά
107+
// best_supertree_tour[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει αλλά
109108
// ΚΑΙ καταλήγει στην κορυφή `u`, και μένει πάντα ΕΚΤΟΣ του υποδέντρου που
110109
// ορίζει η `u`. Το φιλοδώρημα της κορυφής `u` ΔΕΝ προσμετράται.
111-
void compute_supertree_loop_opt(int u) {
112-
supertree_loop_opt[u] = 0;
110+
void compute_best_supertree_tour(int u) {
111+
best_supertree_tour[u] = 0;
113112

114113
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
115114
if (parent[u] != u)
116-
supertree_loop_opt[u] =
117-
positive_part(subtree_loop_opt[parent[u]] + supertree_loop_opt[parent[u]]
118-
- positive_part(subtree_loop_opt[u] - 2*parent_weight[u]) - 2*parent_weight[u]);
115+
best_supertree_tour[u] =
116+
positive_part(best_subtree_tour[parent[u]] + best_supertree_tour[parent[u]]
117+
- positive_part(best_subtree_tour[u] - 2*parent_weight[u]) - 2*parent_weight[u]);
119118

120119
for (auto [v, w]: tree[u])
121120
if (v != parent[u])
122-
compute_supertree_loop_opt(v);
121+
compute_best_supertree_tour(v);
123122
}
124123

125124
// Υπολογίζει τον πίνακα `pred` έτσι ώστε για κάθε 0 <= h <= H, 0 <= u < N:
@@ -209,17 +208,17 @@ int main() {
209208

210209
compute_pred();
211210

212-
compute_subtree_loop_opt(0);
213-
compute_supertree_loop_opt(0);
214-
compute_supertree_root_opt(0);
211+
compute_best_subtree_tour(0);
212+
compute_best_supertree_tour(0);
213+
compute_best_supertree_root_walk(0);
215214

216215
for (long i = 0; i < q; ++i) {
217216
long L, R;
218217
scanf("%li%li", &L, &R);
219218
L--, R--;
220219

221220
if (L == R) {
222-
printf("%lli\n", subtree_loop_opt[L] + supertree_loop_opt[L]);
221+
printf("%lli\n", best_subtree_tour[L] + best_supertree_tour[L]);
223222
continue;
224223
}
225224

@@ -230,23 +229,26 @@ int main() {
230229
if (u == -1) {
231230
// Η κορυφή `L` είναι πρόγονος της `R`.
232231
assert(z == L);
233-
sol = supertree_root_opt[R] - supertree_root_opt[L] + supertree_loop_opt[L] + subtree_loop_opt[R];
232+
sol = best_supertree_root_walk[R] - best_supertree_root_walk[L]
233+
+ best_supertree_tour[L] + best_subtree_tour[R];
234234
} else if (v == -1) {
235235
// Η κορυφή `R` είναι πρόγονος της `L`.
236236
assert(z == R);
237-
sol = supertree_root_opt[L] - supertree_root_opt[R] + supertree_loop_opt[R] + subtree_loop_opt[L];
237+
sol = best_supertree_root_walk[L] - best_supertree_root_walk[R]
238+
+ best_supertree_tour[R] + best_subtree_tour[L];
238239
} else {
239240
// Οι κορυφές `L, R` έχουν κοινό πρόγονο τον `z != L, R`.
240241
assert(pred[0][u] == z);
241242
assert(pred[0][v] == z);
242243

243-
sol = supertree_root_opt[L] - supertree_root_opt[u] + subtree_loop_opt[L] // (a)
244-
+ supertree_root_opt[R] - supertree_root_opt[v] + subtree_loop_opt[R] // (b)
245-
+ subtree_loop_opt[z] // (c1)
246-
- positive_part(subtree_loop_opt[u] - 2*parent_weight[u]) // (c2)
247-
- positive_part(subtree_loop_opt[v] - 2*parent_weight[v]) // (c3)
248-
+ supertree_loop_opt[z] // (d)
249-
- (parent_weight[u] + parent_weight[v]); // (e)
244+
sol =
245+
best_supertree_root_walk[L] - best_supertree_root_walk[u] + best_subtree_tour[L] // (a)
246+
+ best_supertree_root_walk[R] - best_supertree_root_walk[v] + best_subtree_tour[R] // (b)
247+
+ best_subtree_tour[z] // (c1)
248+
- positive_part(best_subtree_tour[u] - 2*parent_weight[u]) // (c2)
249+
- positive_part(best_subtree_tour[v] - 2*parent_weight[v]) // (c3)
250+
+ best_supertree_tour[z] // (d)
251+
- (parent_weight[u] + parent_weight[v]); // (e)
250252
}
251253

252254
printf("%lli\n", sol);

_includes/source_code/code/37-PDP/tiphunting/subtask2.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ long long positive_part(long long x) { return max(0LL, x); }
1717
// από την κορυφή `u`, καταλήγει πίσω σε αυτή και παραμένει
1818
// εξ' ολοκλήρου μέσα στο υποδέντρο που ορίζει η `u`. Με άλλα λόγια,
1919
// η διαδρομή απαγορεύεται να διασχίσει το δρόμο `(u, parent)`.
20-
long long subtree_loop_opt(long u, long parent) {
20+
long long best_subtree_tour(long u, long parent) {
2121
long long sol = tip[u];
2222

2323
for (auto [v, w]: tree[u]) {
2424
if (v == parent) continue;
25-
long long s = subtree_loop_opt(v, u);
25+
long long s = best_subtree_tour(v, u);
2626
sol += positive_part(s - 2*w);
2727
}
2828

@@ -59,7 +59,7 @@ int main() {
5959
L--, R--;
6060
assert(L == R);
6161

62-
printf("%lli\n", subtree_loop_opt(L, L));
62+
printf("%lli\n", best_subtree_tour(L, L));
6363
}
6464

6565
return 0;

_includes/source_code/code/37-PDP/tiphunting/subtask3.cc

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,46 @@ using vvll = vector<vector<ll>>;
1010

1111
vvll tree;
1212
vl tip;
13-
vector<long long> subtree_loop_opt, supertree_root_opt;
13+
vector<long long> best_subtree_tour, best_supertree_root_walk;
1414

1515
long long positive_part(long long x) { return max(0LL, x); }
1616

17-
// Πρώτη διάσχιση η οποία υπολογίζει το `subtree_loop_opt` για την κορυφή `u`
17+
// Πρώτη διάσχιση η οποία υπολογίζει το `best_subtree_tour` για την κορυφή `u`
1818
// κι όλους τους απογόνους της.
1919
//
20-
// subtree_loop_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
21-
// και καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει
22-
// η κορυφή `u`. Με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει
23-
// τον δρόμο `(u, parent)`.
24-
void compute_subtree_loop_opt(long u, long parent) {
25-
subtree_loop_opt[u] = tip[u];
20+
// best_subtree_tour[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει και
21+
// καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει η κορυφή
22+
// `u`. Με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει τον δρόμο `(u,
23+
// parent)`.
24+
void compute_best_subtree_tour(long u, long parent) {
25+
best_subtree_tour[u] = tip[u];
2626

2727
for (auto [v, w]: tree[u]) {
2828
if (v == parent) continue;
29-
compute_subtree_loop_opt(v, u);
30-
subtree_loop_opt[u] += positive_part(subtree_loop_opt[v] - 2*w);
29+
compute_best_subtree_tour(v, u);
30+
best_subtree_tour[u] += positive_part(best_subtree_tour[v] - 2*w);
3131
}
3232
}
3333

34-
// Δεύτερη διάσχιση η οποία υπολογίζει το `supertree_root_opt` για την κορυφή
35-
// `u` κι όλους τους απογόνους της, χρησιμοποιώντας τις τιμές
36-
// `subtree_loop_opt` που υπολογίσαμε ήδη στην πρώτη διάσχιση.
34+
// Δεύτερη διάσχιση η οποία υπολογίζει το `best_supertree_root_walk` για την
35+
// κορυφή `u` κι όλους τους απογόνους της, χρησιμοποιώντας τις τιμές
36+
// `best_subtree_tour` που υπολογίσαμε ήδη στην πρώτη διάσχιση.
3737
//
38-
// supertree_root_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
39-
// από την κορυφή `u`, καταλήγει στη ρίζα τους δέντρου και
40-
// μένει πάντα ΕΚΤΟΣ του υποδέντρου που ορίζει η `u`. Το φιλοδώρημα της κορυφής
41-
// `u` ΔΕΝ προσμετράται.
42-
void compute_supertree_root_opt(long u, long parent, long w) {
43-
supertree_root_opt[u] = 0;
38+
// best_supertree_root_walk[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
39+
// από την κορυφή `u`, καταλήγει στη ρίζα τους δέντρου και μένει πάντα ΕΚΤΟΣ του
40+
// υποδέντρου που ορίζει η `u`. Το φιλοδώρημα της κορυφής `u` ΔΕΝ προσμετράται.
41+
void compute_best_supertree_root_walk(long u, long parent, long w) {
42+
best_supertree_root_walk[u] = 0;
4443

4544
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
4645
if (parent != u)
47-
supertree_root_opt[u] =
48-
subtree_loop_opt[parent] + supertree_root_opt[parent]
49-
- positive_part(subtree_loop_opt[u] - 2*w) - w;
46+
best_supertree_root_walk[u] =
47+
best_subtree_tour[parent] + best_supertree_root_walk[parent]
48+
- positive_part(best_subtree_tour[u] - 2*w) - w;
5049

5150
for (auto [v, w]: tree[u])
5251
if (v != parent)
53-
compute_supertree_root_opt(v, u, w);
52+
compute_best_supertree_root_walk(v, u, w);
5453
}
5554

5655
int main() {
@@ -77,17 +76,17 @@ int main() {
7776
tree[v-1].push_back({u-1, w});
7877
}
7978

80-
subtree_loop_opt.resize(n);
81-
supertree_root_opt.resize(n);
79+
best_subtree_tour.resize(n);
80+
best_supertree_root_walk.resize(n);
8281

8382
for (long i = 0; i < q; ++i) {
8483
long L, R;
8584
scanf("%li%li", &L, &R);
8685
L--, R--;
87-
compute_subtree_loop_opt(R, R);
88-
compute_supertree_root_opt(R, R, 0);
86+
compute_best_subtree_tour(R, R);
87+
compute_best_supertree_root_walk(R, R, 0);
8988

90-
printf("%lli\n", subtree_loop_opt[L] + supertree_root_opt[L]);
89+
printf("%lli\n", best_subtree_tour[L] + best_supertree_root_walk[L]);
9190
}
9291

9392
return 0;

_includes/source_code/code/37-PDP/tiphunting/subtask4.cc

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,46 +10,46 @@ using vvll = vector<vector<ll>>;
1010

1111
vvll tree;
1212
vl tip;
13-
vector<long long> subtree_loop_opt, supertree_loop_opt;
13+
vector<long long> best_subtree_tour, best_supertree_tour;
1414

1515
long long positive_part(long long x) { return max(0LL, x); }
1616

17-
// Πρώτη διάσχιση η οποία υπολογίζει το `subtree_loop_opt` για την κορυφή `u`
17+
// Πρώτη διάσχιση η οποία υπολογίζει το `best_subtree_tour` για την κορυφή `u`
1818
// κι όλους τους απογόνους της.
1919
//
20-
// subtree_loop_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει
21-
// και καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει
22-
// η κορυφή `u`. Με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει
23-
// τον δρόμο `(u, parent)`.
24-
void compute_subtree_loop_opt(long u, long parent) {
25-
subtree_loop_opt[u] = tip[u];
20+
// best_subtree_tour[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει και
21+
// καταλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει η κορυφή
22+
// `u`. Με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει τον δρόμο `(u,
23+
// parent)`.
24+
void compute_best_subtree_tour(long u, long parent) {
25+
best_subtree_tour[u] = tip[u];
2626

2727
for (auto [v, w]: tree[u]) {
2828
if (v == parent) continue;
29-
compute_subtree_loop_opt(v, u);
30-
subtree_loop_opt[u] += positive_part(subtree_loop_opt[v] - 2*w);
29+
compute_best_subtree_tour(v, u);
30+
best_subtree_tour[u] += positive_part(best_subtree_tour[v] - 2*w);
3131
}
3232
}
3333

34-
// Δεύτερη διάσχιση η οποία υπολογίζει το `supertree_loop_opt` για την κορυφή
34+
// Δεύτερη διάσχιση η οποία υπολογίζει το `best_supertree_tour` για την κορυφή
3535
// `u` κι όλους τους απογόνους της, χρησιμοποιώντας τις τιμές
36-
// `subtree_loop_opt` που υπολογίσαμε ήδη στην πρώτη διάσχιση.
36+
// `best_subtree_tour` που υπολογίσαμε ήδη στην πρώτη διάσχιση.
3737
//
38-
// supertree_loop_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει αλλά
38+
// best_supertree_tour[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει αλλά
3939
// ΚΑΙ καταλήγει στην κορυφή `u`, και μένει πάντα ΕΚΤΟΣ του υποδέντρου που
4040
// ορίζει η `u`. Το φιλοδώρημα της κορυφής `u` ΔΕΝ προσμετράται.
41-
void compute_supertree_loop_opt(long u, long parent, long w) {
42-
supertree_loop_opt[u] = 0;
41+
void compute_best_supertree_tour(long u, long parent, long w) {
42+
best_supertree_tour[u] = 0;
4343

4444
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
4545
if (parent != u)
46-
supertree_loop_opt[u] =
47-
positive_part(subtree_loop_opt[parent] + supertree_loop_opt[parent]
48-
- positive_part(subtree_loop_opt[u] - 2*w) - 2*w);
46+
best_supertree_tour[u] =
47+
positive_part(best_subtree_tour[parent] + best_supertree_tour[parent]
48+
- positive_part(best_subtree_tour[u] - 2*w) - 2*w);
4949

5050
for (auto [v, w]: tree[u])
5151
if (v != parent)
52-
compute_supertree_loop_opt(v, u, w);
52+
compute_best_supertree_tour(v, u, w);
5353
}
5454

5555
int main() {
@@ -76,19 +76,19 @@ int main() {
7676
tree[v-1].push_back({u-1, w});
7777
}
7878

79-
subtree_loop_opt.resize(n);
80-
compute_subtree_loop_opt(0, 0);
79+
best_subtree_tour.resize(n);
80+
compute_best_subtree_tour(0, 0);
8181

82-
supertree_loop_opt.resize(n);
83-
compute_supertree_loop_opt(0, 0, 0);
82+
best_supertree_tour.resize(n);
83+
compute_best_supertree_tour(0, 0, 0);
8484

8585
for (long i = 0; i < q; ++i) {
8686
long L, R;
8787
scanf("%li%li", &L, &R);
8888
L--, R--;
8989
assert(L == R);
9090

91-
printf("%lli\n", subtree_loop_opt[L] + supertree_loop_opt[L]);
91+
printf("%lli\n", best_subtree_tour[L] + best_supertree_tour[L]);
9292
}
9393

9494
return 0;

0 commit comments

Comments
 (0)