Skip to content

Commit 3f9178d

Browse files
committed
Use global vars on all subtasks
1 parent 26e1de9 commit 3f9178d

File tree

6 files changed

+95
-90
lines changed

6 files changed

+95
-90
lines changed

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@
22
#include <cassert>
33
#include <vector>
44
#include <cmath>
5-
// #define DEBUG
6-
7-
#ifdef DEBUG
8-
#define debug(...) fprintf(stderr, __VA_ARGS__)
9-
#else
10-
#define debug(...) ((void)0)
11-
#endif
125

136
using namespace std;
147

@@ -75,7 +68,8 @@ void compute_subtree_loop_opt(long u) {
7568
void compute_supertree_root_opt(long u) {
7669
supertree_root_opt[u] = 0;
7770

78-
if (parent[u] != -1)
71+
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
72+
if (parent[u] != u)
7973
supertree_root_opt[u] =
8074
subtree_loop_opt[parent[u]] + supertree_root_opt[parent[u]]
8175
- positive_part(subtree_loop_opt[u] - 2*parent_weight[u]) - parent_weight[u];
@@ -96,7 +90,8 @@ void compute_supertree_root_opt(long u) {
9690
void compute_supertree_loop_opt(int u) {
9791
supertree_loop_opt[u] = 0;
9892

99-
if (parent[u] != -1)
93+
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
94+
if (parent[u] != u)
10095
supertree_loop_opt[u] =
10196
positive_part(subtree_loop_opt[parent[u]] + supertree_loop_opt[parent[u]]
10297
- positive_part(subtree_loop_opt[u] - 2*parent_weight[u]) - 2*parent_weight[u]);
@@ -210,11 +205,13 @@ int main() {
210205
compute_pred(H);
211206

212207
subtree_loop_opt.resize(n);
208+
compute_subtree_loop_opt(0);
209+
213210
supertree_loop_opt.resize(n);
211+
compute_supertree_loop_opt(0);
212+
214213
supertree_root_opt.resize(n);
215-
compute_subtree_loop_opt(0);
216214
compute_supertree_root_opt(0);
217-
compute_supertree_loop_opt(0);
218215

219216
for (long i = 0; i < q; ++i) {
220217
long L, R;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ int main() {
2424
}
2525

2626
for (long i = 0; i < q; ++i) {
27-
long src, dst;
28-
scanf("%li%li", &src, &dst);
27+
long L, R;
28+
scanf("%li%li", &L, &R);
2929
printf("%lli\n", sol);
3030
}
3131

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,24 @@
55
using namespace std;
66

77
using ll = pair<long, long>;
8+
using vl = vector<long>;
89
using vvll = vector<vector<ll>>;
910

11+
vvll tree;
12+
vl tip;
13+
1014
long long positive_part(long long x) { return max(0LL, x); }
1115

1216
// Επιστρέφει το κέρδος της βέλτιστης διαδρομή η οποία ξεκινάει
1317
// από την κορυφή `u`, καταλλήγει πίσω σε αυτή και παραμένει
1418
// εξ' ολοκλήρου μέσα στο υποδέντρο που ορίζει η `u` -- με άλλα λόγια,
1519
// η διαδρομή απαγορεύεται να διασχίσει το δρόμο `(u, parent)`.
16-
long long subtree_loop_opt(const vvll& tree, const vector<long>& tip, long u, long parent) {
20+
long long subtree_loop_opt(long u, long parent) {
1721
long long sol = tip[u];
1822

1923
for (auto [v, w]: tree[u]) {
2024
if (v == parent) continue;
21-
long long s = subtree_loop_opt(tree, tip, v, u);
25+
long long s = subtree_loop_opt(v, u);
2226
sol += positive_part(s - 2*w);
2327
}
2428

@@ -32,33 +36,29 @@ int main() {
3236

3337
long n, q;
3438
scanf("%li%li", &n, &q);
35-
assert(1 <= n && n <= 1'000);
36-
assert(1 <= q && q <= 1'000);
3739

38-
vector<long> tip(n);
40+
tip.resize(n);
3941
for (long i = 0; i < n; ++i)
4042
scanf("%li", &tip[i]);
4143

4244
// Αναπαράσταση του δέντρου με adjacency list:
4345
// To `tree[u]` περιέχει ένα vector με pairs `(v, w)` για κάθε κορυφή `v` που
4446
// συνδέεται με τη `u` με κόστός `w`.
45-
vvll tree(n);
47+
tree.resize(n);
4648
for (long i = 0; i < n-1; ++i) {
4749
long u, v, w;
4850
scanf("%li%li%li", &u, &v, &w);
49-
assert(1 <= u && u <= n);
50-
assert(1 <= v && v <= n);
5151

5252
tree[u-1].push_back({v-1, w});
5353
tree[v-1].push_back({u-1, w});
5454
}
5555

5656
for (long i = 0; i < q; ++i) {
57-
long src, dst;
58-
scanf("%li%li", &src, &dst);
59-
assert(src == dst);
57+
long L, R;
58+
scanf("%li%li", &L, &R);
59+
assert(L == R);
6060

61-
printf("%lli\n", subtree_loop_opt(tree, tip, src-1, -1));
61+
printf("%lli\n", subtree_loop_opt(L-1, L-1));
6262
}
6363

6464
return 0;

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

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
using namespace std;
66

77
using ll = pair<long, long>;
8+
using vl = vector<long>;
89
using vvll = vector<vector<ll>>;
910

11+
vvll tree;
12+
vl tip;
13+
vector<long long> subtree_loop_opt, supertree_root_opt;
14+
1015
long long positive_part(long long x) { return max(0LL, x); }
1116

1217
// Πρώτη διαπέραση η οποία υπολογίζει το `subtree_loop_opt` για την κορυφή `u`
@@ -16,13 +21,12 @@ long long positive_part(long long x) { return max(0LL, x); }
1621
// και καταλλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει
1722
// η κορυφή `u` -- με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει
1823
// τον δρόμο `(u, parent)`.
19-
void compute_subtree_loop_opt(vector<long long>& subtree_loop_opt, const vvll& tree, const vector<long>& tip, long u, long parent) {
24+
void compute_subtree_loop_opt(long u, long parent) {
2025
subtree_loop_opt[u] = tip[u];
2126

22-
int x;
2327
for (auto [v, w]: tree[u]) {
2428
if (v == parent) continue;
25-
compute_subtree_loop_opt(subtree_loop_opt, tree, tip, v, u);
29+
compute_subtree_loop_opt(v, u);
2630
subtree_loop_opt[u] += positive_part(subtree_loop_opt[v] - 2*w);
2731
}
2832
}
@@ -35,18 +39,16 @@ void compute_subtree_loop_opt(vector<long long>& subtree_loop_opt, const vvll& t
3539
// από την κορυφή `u`, καταλλήγει στη ρίζα τους δέντρου και
3640
// μένει πάντα ΕΚΤΟΣ του υποδέντρου που ορίζει η `u`. Το φιλοδώρημα της κορυφής
3741
// `u` ΔΕΝ προσμετράται.
38-
void compute_supertree_root_opt(vector<long long>& supertree_root_opt, const vector<long long>& subtree_loop_opt, const vvll& tree, long u, long parent, long w) {
39-
assert(0 <= u && u < tree.size());
40-
assert(-1 <= parent && parent < (long long)tree.size());
41-
42+
void compute_supertree_root_opt(long u, long parent, long w) {
4243
supertree_root_opt[u] = 0;
4344

44-
if (parent != -1)
45+
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
46+
if (parent != u)
4547
supertree_root_opt[u] = subtree_loop_opt[parent] + supertree_root_opt[parent] - positive_part(subtree_loop_opt[u] - 2*w) - w;
4648

4749
for (auto [v, w]: tree[u])
4850
if (v != parent)
49-
compute_supertree_root_opt(supertree_root_opt, subtree_loop_opt, tree, v, u, w);
51+
compute_supertree_root_opt(v, u, w);
5052
}
5153

5254
int main() {
@@ -57,35 +59,35 @@ int main() {
5759
long n, q;
5860
scanf("%li%li", &n, &q);
5961

60-
vector<long> tip(n);
62+
tip.resize(n);
6163
for (long i = 0; i < n; ++i)
6264
scanf("%li", &tip[i]);
6365

6466
// Αναπαράσταση του δέντρου με adjacency list:
6567
// To `tree[u]` περιέχει ένα vector με pairs `(v, w)` για κάθε κορυφή `v` που
6668
// συνδέεται με τη `u` με κόστός `w`.
67-
vvll tree(n);
69+
tree.resize(n);
6870
for (long i = 0; i < n-1; ++i) {
6971
long u, v, w;
7072
scanf("%li%li%li", &u, &v, &w);
71-
assert(1 <= u && u <= n);
72-
assert(1 <= v && v <= n);
7373

7474
tree[u-1].push_back({v-1, w});
7575
tree[v-1].push_back({u-1, w});
7676
}
7777

78+
subtree_loop_opt.resize(n);
79+
supertree_root_opt.resize(n);
80+
7881
for (long i = 0; i < q; ++i) {
79-
long src, dst;
80-
scanf("%li%li", &src, &dst);
81-
src -= 1;
82-
dst -= 1;
82+
long L, R;
83+
scanf("%li%li", &L, &R);
84+
L -= 1;
85+
R -= 1;
8386

84-
vector<long long> subtree_loop_opt(n), supertree_root_opt(n);
85-
compute_subtree_loop_opt(subtree_loop_opt, tree, tip, dst, -1);
86-
compute_supertree_root_opt(supertree_root_opt, subtree_loop_opt, tree, dst, -1, -1);
87+
compute_subtree_loop_opt(R, R);
88+
compute_supertree_root_opt(R, R, 0);
8789

88-
printf("%lli\n", subtree_loop_opt[src] + supertree_root_opt[src]);
90+
printf("%lli\n", subtree_loop_opt[L] + supertree_root_opt[L]);
8991
}
9092

9193
return 0;

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

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
using namespace std;
66

77
using ll = pair<long, long>;
8+
using vl = vector<long>;
89
using vvll = vector<vector<ll>>;
910

11+
vvll tree;
12+
vl tip;
13+
vector<long long> subtree_loop_opt, supertree_loop_opt;
14+
1015
long long positive_part(long long x) { return max(0LL, x); }
1116

1217
// Πρώτη διαπέραση η οποία υπολογίζει το `subtree_loop_opt` για την κορυφή `u`
@@ -16,12 +21,12 @@ long long positive_part(long long x) { return max(0LL, x); }
1621
// και καταλλήγει πάλι πίσω στο `u`, παραμένοντας στο υποδέντρο που ορίζει
1722
// η κορυφή `u` -- με άλλα λόγια, η διαδρομή απαγορεύεται να διασχίσει
1823
// τον δρόμο `(u, parent)`.
19-
void compute_subtree_loop_opt(vector<long long>& subtree_loop_opt, const vvll& tree, const vector<long>& tip, long u, long parent) {
24+
void compute_subtree_loop_opt(long u, long parent) {
2025
subtree_loop_opt[u] = tip[u];
2126

2227
for (auto [v, w]: tree[u]) {
2328
if (v == parent) continue;
24-
compute_subtree_loop_opt(subtree_loop_opt, tree, tip, v, u);
29+
compute_subtree_loop_opt(v, u);
2530
subtree_loop_opt[u] += positive_part(subtree_loop_opt[v] - 2*w);
2631
}
2732
}
@@ -33,18 +38,16 @@ void compute_subtree_loop_opt(vector<long long>& subtree_loop_opt, const vvll& t
3338
// supertree_loop_opt[u] = κέρδος της βέλτιστης διαδρομής η οποία ξεκινάει αλλά
3439
// ΚΑΙ καταλήγει στην κορυφή `u`, και μένει πάντα ΕΚΤΟΣ του υποδέντρου που
3540
// ορίζει η `u`. Το φιλοδώρημα της κορυφής `u` ΔΕΝ προσμετράται.
36-
void compute_supertree_loop_opt(vector<long long>& supertree_loop_opt, const vector<long long>& subtree_loop_opt, const vvll& tree, long u, long parent, long w) {
37-
assert(0 <= u && u < tree.size());
38-
assert(-1 <= parent && parent < (long long)tree.size());
39-
41+
void compute_supertree_loop_opt(long u, long parent, long w) {
4042
supertree_loop_opt[u] = 0;
4143

42-
if (parent != -1)
44+
// Αν η κορυφή `u` ΔΕΝ είναι ρίζα.
45+
if (parent != u)
4346
supertree_loop_opt[u] = positive_part(subtree_loop_opt[parent] + supertree_loop_opt[parent] - positive_part(subtree_loop_opt[u] - 2*w) - 2*w);
4447

4548
for (auto [v, w]: tree[u])
4649
if (v != parent)
47-
compute_supertree_loop_opt(supertree_loop_opt, subtree_loop_opt, tree, v, u, w);
50+
compute_supertree_loop_opt(v, u, w);
4851
}
4952

5053
int main() {
@@ -55,35 +58,34 @@ int main() {
5558
long n, q;
5659
scanf("%li%li", &n, &q);
5760

58-
vector<long> tip(n);
61+
tip.resize(n);
5962
for (long i = 0; i < n; ++i)
6063
scanf("%li", &tip[i]);
6164

6265
// Αναπαράσταση του δέντρου με adjacency list:
6366
// To `tree[u]` περιέχει ένα vector με pairs `(v, w)` για κάθε κορυφή `v` που
6467
// συνδέεται με τη `u` με κόστός `w`.
65-
vvll tree(n);
68+
tree.resize(n);
6669
for (long i = 0; i < n-1; ++i) {
6770
long u, v, w;
6871
scanf("%li%li%li", &u, &v, &w);
69-
assert(1 <= u && u <= n);
70-
assert(1 <= v && v <= n);
7172

7273
tree[u-1].push_back({v-1, w});
7374
tree[v-1].push_back({u-1, w});
7475
}
7576

76-
vector<long long> subtree_loop_opt(n);
77-
vector<long long> supertree_loop_opt(n);
78-
compute_subtree_loop_opt(subtree_loop_opt, tree, tip, 0, -1);
79-
compute_supertree_loop_opt(supertree_loop_opt, subtree_loop_opt, tree, 0, -1, -1);
77+
subtree_loop_opt.resize(n);
78+
compute_subtree_loop_opt(0, 0);
79+
80+
supertree_loop_opt.resize(n);
81+
compute_supertree_loop_opt(0, 0, 0);
8082

8183
for (long i = 0; i < q; ++i) {
82-
long src, dst;
83-
scanf("%li%li", &src, &dst);
84-
assert(src == dst);
84+
long L, R;
85+
scanf("%li%li", &L, &R);
86+
assert(L == R);
8587

86-
printf("%lli\n", subtree_loop_opt[src-1] + supertree_loop_opt[src-1]);
88+
printf("%lli\n", subtree_loop_opt[L-1] + supertree_loop_opt[L-1]);
8789
}
8890

8991
return 0;

0 commit comments

Comments
 (0)