답안 #1109694

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1109694 2024-11-07T10:36:37 Z _callmelucian Designated Cities (JOI19_designated_cities) C++17
39 / 100
2000 ms 59464 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pl;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tpl;

#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())

const int mn = 2e5 + 5;

struct IT {
    vector<pl> tr;
    vector<ll> lazy;

    IT (int sz) : tr(4 * sz), lazy(4 * sz) {}

    void apply (int k, ll val) {
        tr[k].first += val, lazy[k] += val;
    }

    void pushDown (int k) {
        if (lazy[k])
            apply(2 * k, lazy[k]), apply(2 * k + 1, lazy[k]), lazy[k] = 0;
    }

    void build (int k, int l, int r, vector<pl> &a) {
        if (l == r)
            return tr[k] = a[l], void();
        int mid = (l + r) >> 1;
        build(2 * k, l, mid, a);
        build(2 * k + 1, mid + 1, r, a);
        tr[k] = max(tr[2 * k], tr[2 * k + 1]);
    }

    void update (int a, int b, ll val, int k, int l, int r) {
        if (b < l || r < a) return;
        if (l == r)
            return apply(k, val), void();
        pushDown(k);
        int mid = (l + r) >> 1;
        update(a, b, val, 2 * k, l, mid);
        update(a, b, val, 2 * k + 1, mid + 1, r);
        tr[k] = max(tr[2 * k], tr[2 * k + 1]);
    }

    pl getBest() { return tr[1]; }
};

vector<tpl> adj[mn];
ll ans[mn], n;

namespace originalTree {
    int bestLeaf[mn], secLeaf[mn];
    ll downPath[mn], upPath[mn], sumDown;

    void dfs (int u, int p, int pA, int pH) {
        // construct costs on paths
        downPath[u] = downPath[p] + pA;
        upPath[u] = upPath[p] + pH;
        bestLeaf[u] = u;

        // run dfs down
        for (tpl item : adj[u]) {
            int v, away, home; tie(v, away, home) = item;
            if (v == p) continue;
            dfs(v, u, away, home);

            sumDown += away;
            if (downPath[bestLeaf[v]] > downPath[bestLeaf[u]])
                secLeaf[u] = bestLeaf[u], bestLeaf[u] = bestLeaf[v];
            else if (downPath[bestLeaf[v]] > downPath[secLeaf[u]]) secLeaf[u] = bestLeaf[v];
        }
    }

    ll tryNode (int u) {
        ll pathOne = downPath[bestLeaf[u]] - (bestLeaf[u] ? downPath[u] : 0);
        ll pathTwo = downPath[secLeaf[u]] - (secLeaf[u] ? downPath[u] : 0);
        return sumDown - pathOne - pathTwo - downPath[u] + upPath[u];
    }

    ll chooseNode (int u) {
        return sumDown - downPath[u] + upPath[u];
    }
}

namespace modifiedTree {
    int num[mn], sz[mn], up[mn], toP[mn], timeDfs;
    bool colored[mn];
    ll weight[mn];
    IT tree(mn);

    bool dfs (int u, int p, int y, int w) {
        num[u] = ++timeDfs, sz[u] = 1, up[u] = p, toP[u] = w;
        if (u == y) colored[u] = 1;

        for (tpl item : adj[u]) {
            int v, away, home; tie(v, away, home) = item;
            if (v == p) continue;
            if (dfs(v, u, y, away)) colored[u] = 1;
            sz[u] += sz[v];
        }
        return colored[u];
    }

    void buildTree() {
        vector<pl> a(n + 1);
        for (int i = 1; i <= n; i++)
            a[num[i]] = make_pair(0, i);
        for (int i = 1; i <= n; i++) {
            int u = a[i].second;
            if (!colored[u])
                a[i].first = weight[u] = weight[up[u]] + toP[u];
        }
        tree.build(1, 1, n, a);
    }

    void colorNode (int u) {
        if (!u) return;
        while (!colored[u]) {
            tree.update(num[u], num[u] + sz[u] - 1, -toP[u], 1, 1, n);
            colored[u] = 1, u = up[u];
        }
    }
};

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i < n; i++) {
        int a, b, c, d; cin >> a >> b >> c >> d;
        adj[a].emplace_back(b, c, d);
        adj[b].emplace_back(a, d, c);
    }
    originalTree::dfs(1, 1, 0, 0);

    for (int i = 1; i <= n; i++) ans[i] = LLONG_MAX;

    int optX = 0, optY = 0;
    for (int i = 1; i <= n; i++) {
        ll cur = originalTree::tryNode(i);
        if (cur < ans[2])
            ans[2] = cur, optX = originalTree::bestLeaf[i], optY = originalTree::secLeaf[i];

        ans[1] = min(ans[1], originalTree::chooseNode(i));
    }
    modifiedTree::dfs(optX, optX, optY, 0);
    modifiedTree::buildTree();

    bool leafLeft = 1;
    for (int i = 3; i <= n; i++) {
        if (leafLeft) {
            ll delta; int node; tie(delta, node) = modifiedTree::tree.getBest();
            ans[i] = ans[i - 1] - delta;

            if (!delta) leafLeft = 0;
            modifiedTree::colorNode(node);
        }
        else ans[i] = ans[i - 1];
    }

    int q; cin >> q;
    while (q--) {
        int E; cin >> E;
        cout << ans[E] << "\n";
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 5 ms 28752 KB Output is correct
3 Correct 5 ms 28752 KB Output is correct
4 Correct 5 ms 28660 KB Output is correct
5 Correct 5 ms 28752 KB Output is correct
6 Correct 5 ms 28752 KB Output is correct
7 Correct 5 ms 28920 KB Output is correct
8 Correct 5 ms 28752 KB Output is correct
9 Correct 5 ms 28752 KB Output is correct
10 Correct 5 ms 28752 KB Output is correct
11 Correct 5 ms 28636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 267 ms 46320 KB Output is correct
3 Correct 145 ms 58440 KB Output is correct
4 Correct 561 ms 46160 KB Output is correct
5 Correct 208 ms 46100 KB Output is correct
6 Correct 208 ms 48200 KB Output is correct
7 Correct 208 ms 46100 KB Output is correct
8 Correct 153 ms 59464 KB Output is correct
9 Correct 185 ms 46212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 344 ms 46408 KB Output is correct
3 Correct 141 ms 58440 KB Output is correct
4 Correct 538 ms 46164 KB Output is correct
5 Correct 201 ms 46228 KB Output is correct
6 Correct 187 ms 48764 KB Output is correct
7 Correct 183 ms 46492 KB Output is correct
8 Correct 175 ms 55704 KB Output is correct
9 Correct 187 ms 46228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 5 ms 28752 KB Output is correct
3 Correct 5 ms 28752 KB Output is correct
4 Correct 5 ms 28660 KB Output is correct
5 Correct 5 ms 28752 KB Output is correct
6 Correct 5 ms 28752 KB Output is correct
7 Correct 5 ms 28920 KB Output is correct
8 Correct 5 ms 28752 KB Output is correct
9 Correct 5 ms 28752 KB Output is correct
10 Correct 5 ms 28752 KB Output is correct
11 Correct 5 ms 28636 KB Output is correct
12 Correct 6 ms 28808 KB Output is correct
13 Correct 7 ms 29008 KB Output is correct
14 Correct 7 ms 29008 KB Output is correct
15 Correct 6 ms 28752 KB Output is correct
16 Correct 9 ms 28752 KB Output is correct
17 Correct 7 ms 28752 KB Output is correct
18 Correct 7 ms 28752 KB Output is correct
19 Correct 7 ms 28780 KB Output is correct
20 Correct 6 ms 29024 KB Output is correct
21 Correct 7 ms 29008 KB Output is correct
22 Correct 7 ms 28916 KB Output is correct
23 Correct 7 ms 28856 KB Output is correct
24 Correct 7 ms 29020 KB Output is correct
25 Correct 6 ms 29008 KB Output is correct
26 Correct 7 ms 29008 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 267 ms 46320 KB Output is correct
3 Correct 145 ms 58440 KB Output is correct
4 Correct 561 ms 46160 KB Output is correct
5 Correct 208 ms 46100 KB Output is correct
6 Correct 208 ms 48200 KB Output is correct
7 Correct 208 ms 46100 KB Output is correct
8 Correct 153 ms 59464 KB Output is correct
9 Correct 185 ms 46212 KB Output is correct
10 Correct 5 ms 28752 KB Output is correct
11 Correct 344 ms 46408 KB Output is correct
12 Correct 141 ms 58440 KB Output is correct
13 Correct 538 ms 46164 KB Output is correct
14 Correct 201 ms 46228 KB Output is correct
15 Correct 187 ms 48764 KB Output is correct
16 Correct 183 ms 46492 KB Output is correct
17 Correct 175 ms 55704 KB Output is correct
18 Correct 187 ms 46228 KB Output is correct
19 Correct 5 ms 28752 KB Output is correct
20 Correct 339 ms 46428 KB Output is correct
21 Correct 190 ms 58468 KB Output is correct
22 Correct 634 ms 46152 KB Output is correct
23 Correct 330 ms 46528 KB Output is correct
24 Correct 523 ms 46152 KB Output is correct
25 Correct 335 ms 46436 KB Output is correct
26 Correct 745 ms 46300 KB Output is correct
27 Correct 250 ms 46212 KB Output is correct
28 Correct 286 ms 48564 KB Output is correct
29 Execution timed out 2065 ms 46408 KB Time limit exceeded
30 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 28752 KB Output is correct
2 Correct 5 ms 28752 KB Output is correct
3 Correct 5 ms 28752 KB Output is correct
4 Correct 5 ms 28660 KB Output is correct
5 Correct 5 ms 28752 KB Output is correct
6 Correct 5 ms 28752 KB Output is correct
7 Correct 5 ms 28920 KB Output is correct
8 Correct 5 ms 28752 KB Output is correct
9 Correct 5 ms 28752 KB Output is correct
10 Correct 5 ms 28752 KB Output is correct
11 Correct 5 ms 28636 KB Output is correct
12 Correct 5 ms 28752 KB Output is correct
13 Correct 267 ms 46320 KB Output is correct
14 Correct 145 ms 58440 KB Output is correct
15 Correct 561 ms 46160 KB Output is correct
16 Correct 208 ms 46100 KB Output is correct
17 Correct 208 ms 48200 KB Output is correct
18 Correct 208 ms 46100 KB Output is correct
19 Correct 153 ms 59464 KB Output is correct
20 Correct 185 ms 46212 KB Output is correct
21 Correct 5 ms 28752 KB Output is correct
22 Correct 344 ms 46408 KB Output is correct
23 Correct 141 ms 58440 KB Output is correct
24 Correct 538 ms 46164 KB Output is correct
25 Correct 201 ms 46228 KB Output is correct
26 Correct 187 ms 48764 KB Output is correct
27 Correct 183 ms 46492 KB Output is correct
28 Correct 175 ms 55704 KB Output is correct
29 Correct 187 ms 46228 KB Output is correct
30 Correct 6 ms 28808 KB Output is correct
31 Correct 7 ms 29008 KB Output is correct
32 Correct 7 ms 29008 KB Output is correct
33 Correct 6 ms 28752 KB Output is correct
34 Correct 9 ms 28752 KB Output is correct
35 Correct 7 ms 28752 KB Output is correct
36 Correct 7 ms 28752 KB Output is correct
37 Correct 7 ms 28780 KB Output is correct
38 Correct 6 ms 29024 KB Output is correct
39 Correct 7 ms 29008 KB Output is correct
40 Correct 7 ms 28916 KB Output is correct
41 Correct 7 ms 28856 KB Output is correct
42 Correct 7 ms 29020 KB Output is correct
43 Correct 6 ms 29008 KB Output is correct
44 Correct 7 ms 29008 KB Output is correct
45 Correct 5 ms 28752 KB Output is correct
46 Correct 339 ms 46428 KB Output is correct
47 Correct 190 ms 58468 KB Output is correct
48 Correct 634 ms 46152 KB Output is correct
49 Correct 330 ms 46528 KB Output is correct
50 Correct 523 ms 46152 KB Output is correct
51 Correct 335 ms 46436 KB Output is correct
52 Correct 745 ms 46300 KB Output is correct
53 Correct 250 ms 46212 KB Output is correct
54 Correct 286 ms 48564 KB Output is correct
55 Execution timed out 2065 ms 46408 KB Time limit exceeded
56 Halted 0 ms 0 KB -