Submission #868465

# Submission time Handle Problem Language Result Execution time Memory
868465 2023-10-31T13:52:00 Z t6twotwo Two Currencies (JOI23_currencies) C++17
100 / 100
975 ms 36904 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct HLD {
    bool e;
    int n, timer;
    vector<int> sz, dep, par, top, pos;
    vector<vector<int>> adj;
    HLD(int n, bool edge) : n(n), e(edge) {
        sz.resize(n);
        dep.resize(n);
        top.resize(n);
        pos.resize(n);
        adj.resize(n);
        par.resize(n);
    }
    void add_edge(int x, int y) {
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    void init(int x) {
        sz[x] = 1;
        for (int &y : adj[x]) {
            dep[y] = dep[x] + 1;
            adj[y].erase(find(adj[y].begin(), adj[y].end(), par[y] = x));
            init(y);
            sz[x] += sz[y];
            if (sz[y] > sz[adj[x][0]]) {
                swap(y, adj[x][0]);
            }
        }
    }
    void dfs(int x) {
        pos[x] = timer++;
        for (int y : adj[x]) {
            top[y] = y == adj[x][0] ? top[x] : y;
            dfs(y);
        }
    }
    void build() {
        par[0] = -1; init(0);
        timer = 0; dfs(0);
    }
    int lca(int x, int y) {
        for (; top[x] != top[y]; x = par[top[x]]) {
            if (dep[top[x]] < dep[top[y]]) {
                swap(x, y);
            }
        }
        return dep[x] < dep[y] ? x : y;
    }
    template <class T>
    void path(int x, int y, T f) {
        for (; top[x] != top[y]; x = par[top[x]]) {
            if (dep[top[x]] < dep[top[y]]) {
                swap(x, y);
            }
            f(pos[top[x]], pos[x] + 1);
        }
        if (dep[x] > dep[y]) {
            swap(x, y);
        }
        f(pos[x] + e, pos[y] + 1);
    }
};
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M, Q;
    cin >> N >> M >> Q;
    vector<pair<int, int>> edges(N - 1);
    vector<vector<int>> adj(N);
    for (int i = 0; i < N - 1; i++) {
        int x, y;
        cin >> x >> y;
        x--, y--;
        edges[i] = {x, y};
        adj[x].push_back(i);
        adj[y].push_back(i);
    }
    vector<pair<int, int>> ch(M);
    for (int i = 0; i < M; i++) {
        int p, c;
        cin >> p >> c;
        ch[i] = {c, p - 1};
    }
    sort(ch.begin(), ch.end());
    vector<int> t(N - 1);
    {
        auto dfs = [&](auto dfs, int x, int p) -> void {
            for (int z : adj[x]) {
                auto [u, v] = edges[z];
                int y = x ^ u ^ v;
                if (y != p) {
                    t[z] = y;
                    dfs(dfs, y, x);
                }
            }
        };
        dfs(dfs, 0, -1);
    }
    HLD hld(N, 1);
    for (int i = 0; i < N; i++) {
        for (int &j : adj[i]) {
            auto [x, y] = edges[j];
            j = i ^ x ^ y;
            if (j < i) {
                hld.add_edge(i, j);
            }
        }
    }
    hld.build();
    vector<int> S(Q), T(Q), X(Q);
    vector<ll> Y(Q);
    for (int i = 0; i < Q; i++) {
        cin >> S[i] >> T[i] >> X[i] >> Y[i];
        S[i]--, T[i]--;
        if (S[i] > T[i]) {
            swap(S[i], T[i]);
        }
    }
    vector<int> lo(Q), hi(Q, M);
    vector<ll> bit(N + 1);
    auto add = [&](int i, int v) {
        for (i++; i <= N; i += i & -i) {
            bit[i] += v;
        }
    };
    auto sum = [&](int i) {
        ll s = 0;
        for (; i; i -= i & -i) {
            s += bit[i];
        }
        return s;
    };
    auto get = [&](int x, int y) {
        ll s = 0;
        hld.path(x, y, [&](int l, int r) {
            s += sum(r) - sum(l);
        });
        return s;
    };
    for (int z = 0; z < 20; z++) {
        vector<int> mi(Q);
        vector<vector<int>> f(M);
        for (int i = 0; i < Q; i++) {
            if (lo[i] != hi[i]) {
                mi[i] = (lo[i] + hi[i] + 1) / 2;
                f[mi[i] - 1].push_back(i);
            }
        }
        bit.assign(N + 1, 0);
        for (int i = 0; i < M; i++) {
            auto [c, p] = ch[i];
            add(hld.pos[t[p]], c);
            for (int j : f[i]) {
                if (get(S[j], T[j]) <= Y[j]) {
                    lo[j] = i + 1;
                } else {
                    hi[j] = i;
                }
            }
        }
    }
    vector<ll> ans(Q);
    vector<vector<int>> f(M + 1);
    for (int i = 0; i < Q; i++) {
        f[lo[i]].push_back(i);
    }
    bit.assign(N + 1, 0);
    for (int i = M; i >= 0; i--) {
        if (i < M) {
            auto [c, p] = ch[i];
            add(hld.pos[t[p]], 1);
        }
        for (int j : f[i]) {
            ans[j] = max(-1LL, X[j] - get(S[j], T[j]));
        }
    }
    for (int i = 0; i < Q; i++) {
        cout << ans[i] << "\n";
    }
    return 6/22;
}

Compilation message

currencies.cpp: In constructor 'HLD::HLD(int, bool)':
currencies.cpp:6:9: warning: 'HLD::n' will be initialized after [-Wreorder]
    6 |     int n, timer;
      |         ^
currencies.cpp:5:10: warning:   'bool HLD::e' [-Wreorder]
    5 |     bool e;
      |          ^
currencies.cpp:9:5: warning:   when initialized here [-Wreorder]
    9 |     HLD(int n, bool edge) : n(n), e(edge) {
      |     ^~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 5 ms 860 KB Output is correct
6 Correct 7 ms 860 KB Output is correct
7 Correct 5 ms 860 KB Output is correct
8 Correct 7 ms 992 KB Output is correct
9 Correct 7 ms 1052 KB Output is correct
10 Correct 7 ms 860 KB Output is correct
11 Correct 7 ms 980 KB Output is correct
12 Correct 7 ms 860 KB Output is correct
13 Correct 5 ms 1116 KB Output is correct
14 Correct 5 ms 1116 KB Output is correct
15 Correct 5 ms 1116 KB Output is correct
16 Correct 6 ms 1028 KB Output is correct
17 Correct 5 ms 860 KB Output is correct
18 Correct 6 ms 860 KB Output is correct
19 Correct 6 ms 860 KB Output is correct
20 Correct 5 ms 1020 KB Output is correct
21 Correct 4 ms 860 KB Output is correct
22 Correct 5 ms 1012 KB Output is correct
23 Correct 6 ms 980 KB Output is correct
24 Correct 6 ms 860 KB Output is correct
25 Correct 6 ms 860 KB Output is correct
26 Correct 4 ms 860 KB Output is correct
27 Correct 4 ms 860 KB Output is correct
28 Correct 5 ms 860 KB Output is correct
29 Correct 4 ms 860 KB Output is correct
30 Correct 7 ms 1008 KB Output is correct
31 Correct 7 ms 856 KB Output is correct
32 Correct 7 ms 860 KB Output is correct
33 Correct 4 ms 1076 KB Output is correct
34 Correct 4 ms 1116 KB Output is correct
35 Correct 4 ms 1116 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 7 ms 860 KB Output is correct
3 Correct 7 ms 860 KB Output is correct
4 Correct 7 ms 860 KB Output is correct
5 Correct 625 ms 25552 KB Output is correct
6 Correct 771 ms 22336 KB Output is correct
7 Correct 759 ms 23080 KB Output is correct
8 Correct 588 ms 22004 KB Output is correct
9 Correct 556 ms 22060 KB Output is correct
10 Correct 878 ms 28368 KB Output is correct
11 Correct 865 ms 28564 KB Output is correct
12 Correct 919 ms 28384 KB Output is correct
13 Correct 860 ms 28312 KB Output is correct
14 Correct 888 ms 28624 KB Output is correct
15 Correct 329 ms 36008 KB Output is correct
16 Correct 333 ms 36508 KB Output is correct
17 Correct 330 ms 35464 KB Output is correct
18 Correct 651 ms 28604 KB Output is correct
19 Correct 614 ms 28552 KB Output is correct
20 Correct 636 ms 28628 KB Output is correct
21 Correct 342 ms 28588 KB Output is correct
22 Correct 342 ms 28832 KB Output is correct
23 Correct 342 ms 27508 KB Output is correct
24 Correct 342 ms 28788 KB Output is correct
25 Correct 663 ms 28812 KB Output is correct
26 Correct 651 ms 28592 KB Output is correct
27 Correct 605 ms 28744 KB Output is correct
28 Correct 322 ms 27312 KB Output is correct
29 Correct 318 ms 27452 KB Output is correct
30 Correct 432 ms 27832 KB Output is correct
31 Correct 388 ms 27536 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 4 ms 1112 KB Output is correct
3 Correct 4 ms 1184 KB Output is correct
4 Correct 5 ms 1168 KB Output is correct
5 Correct 211 ms 31388 KB Output is correct
6 Correct 200 ms 29944 KB Output is correct
7 Correct 273 ms 25152 KB Output is correct
8 Correct 329 ms 36904 KB Output is correct
9 Correct 328 ms 36596 KB Output is correct
10 Correct 331 ms 36588 KB Output is correct
11 Correct 273 ms 36712 KB Output is correct
12 Correct 285 ms 36492 KB Output is correct
13 Correct 281 ms 36456 KB Output is correct
14 Correct 269 ms 36472 KB Output is correct
15 Correct 249 ms 36520 KB Output is correct
16 Correct 270 ms 36752 KB Output is correct
17 Correct 278 ms 36480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 5 ms 860 KB Output is correct
6 Correct 7 ms 860 KB Output is correct
7 Correct 5 ms 860 KB Output is correct
8 Correct 7 ms 992 KB Output is correct
9 Correct 7 ms 1052 KB Output is correct
10 Correct 7 ms 860 KB Output is correct
11 Correct 7 ms 980 KB Output is correct
12 Correct 7 ms 860 KB Output is correct
13 Correct 5 ms 1116 KB Output is correct
14 Correct 5 ms 1116 KB Output is correct
15 Correct 5 ms 1116 KB Output is correct
16 Correct 6 ms 1028 KB Output is correct
17 Correct 5 ms 860 KB Output is correct
18 Correct 6 ms 860 KB Output is correct
19 Correct 6 ms 860 KB Output is correct
20 Correct 5 ms 1020 KB Output is correct
21 Correct 4 ms 860 KB Output is correct
22 Correct 5 ms 1012 KB Output is correct
23 Correct 6 ms 980 KB Output is correct
24 Correct 6 ms 860 KB Output is correct
25 Correct 6 ms 860 KB Output is correct
26 Correct 4 ms 860 KB Output is correct
27 Correct 4 ms 860 KB Output is correct
28 Correct 5 ms 860 KB Output is correct
29 Correct 4 ms 860 KB Output is correct
30 Correct 7 ms 1008 KB Output is correct
31 Correct 7 ms 856 KB Output is correct
32 Correct 7 ms 860 KB Output is correct
33 Correct 4 ms 1076 KB Output is correct
34 Correct 4 ms 1116 KB Output is correct
35 Correct 4 ms 1116 KB Output is correct
36 Correct 0 ms 344 KB Output is correct
37 Correct 7 ms 860 KB Output is correct
38 Correct 7 ms 860 KB Output is correct
39 Correct 7 ms 860 KB Output is correct
40 Correct 625 ms 25552 KB Output is correct
41 Correct 771 ms 22336 KB Output is correct
42 Correct 759 ms 23080 KB Output is correct
43 Correct 588 ms 22004 KB Output is correct
44 Correct 556 ms 22060 KB Output is correct
45 Correct 878 ms 28368 KB Output is correct
46 Correct 865 ms 28564 KB Output is correct
47 Correct 919 ms 28384 KB Output is correct
48 Correct 860 ms 28312 KB Output is correct
49 Correct 888 ms 28624 KB Output is correct
50 Correct 329 ms 36008 KB Output is correct
51 Correct 333 ms 36508 KB Output is correct
52 Correct 330 ms 35464 KB Output is correct
53 Correct 651 ms 28604 KB Output is correct
54 Correct 614 ms 28552 KB Output is correct
55 Correct 636 ms 28628 KB Output is correct
56 Correct 342 ms 28588 KB Output is correct
57 Correct 342 ms 28832 KB Output is correct
58 Correct 342 ms 27508 KB Output is correct
59 Correct 342 ms 28788 KB Output is correct
60 Correct 663 ms 28812 KB Output is correct
61 Correct 651 ms 28592 KB Output is correct
62 Correct 605 ms 28744 KB Output is correct
63 Correct 322 ms 27312 KB Output is correct
64 Correct 318 ms 27452 KB Output is correct
65 Correct 432 ms 27832 KB Output is correct
66 Correct 388 ms 27536 KB Output is correct
67 Correct 0 ms 344 KB Output is correct
68 Correct 4 ms 1112 KB Output is correct
69 Correct 4 ms 1184 KB Output is correct
70 Correct 5 ms 1168 KB Output is correct
71 Correct 211 ms 31388 KB Output is correct
72 Correct 200 ms 29944 KB Output is correct
73 Correct 273 ms 25152 KB Output is correct
74 Correct 329 ms 36904 KB Output is correct
75 Correct 328 ms 36596 KB Output is correct
76 Correct 331 ms 36588 KB Output is correct
77 Correct 273 ms 36712 KB Output is correct
78 Correct 285 ms 36492 KB Output is correct
79 Correct 281 ms 36456 KB Output is correct
80 Correct 269 ms 36472 KB Output is correct
81 Correct 249 ms 36520 KB Output is correct
82 Correct 270 ms 36752 KB Output is correct
83 Correct 278 ms 36480 KB Output is correct
84 Correct 580 ms 23356 KB Output is correct
85 Correct 629 ms 19104 KB Output is correct
86 Correct 565 ms 17208 KB Output is correct
87 Correct 897 ms 28236 KB Output is correct
88 Correct 909 ms 28560 KB Output is correct
89 Correct 896 ms 28464 KB Output is correct
90 Correct 975 ms 28668 KB Output is correct
91 Correct 913 ms 28228 KB Output is correct
92 Correct 371 ms 33960 KB Output is correct
93 Correct 359 ms 35368 KB Output is correct
94 Correct 647 ms 28044 KB Output is correct
95 Correct 647 ms 28688 KB Output is correct
96 Correct 645 ms 26508 KB Output is correct
97 Correct 667 ms 25320 KB Output is correct
98 Correct 397 ms 26008 KB Output is correct
99 Correct 367 ms 25868 KB Output is correct
100 Correct 396 ms 26208 KB Output is correct
101 Correct 374 ms 25912 KB Output is correct
102 Correct 644 ms 25480 KB Output is correct
103 Correct 656 ms 25736 KB Output is correct
104 Correct 654 ms 25496 KB Output is correct
105 Correct 355 ms 24276 KB Output is correct
106 Correct 383 ms 24580 KB Output is correct
107 Correct 445 ms 24760 KB Output is correct
108 Correct 415 ms 24564 KB Output is correct