제출 #1329418

#제출 시각아이디문제언어결과실행 시간메모리
1329418chikien2009Designated Cities (JOI19_designated_cities)C++20
0 / 100
117 ms18356 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
// #ifndef ONLINE_JUDGE
//     freopen("test.inp", "r", stdin);
//     freopen("test.out", "w", stdout);
// #endif
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, q, a, b, c, d;
int best_leave[200000], pre_node[200000];
long long all;
long long f[200000], res[200001], best_val[200000];
vector<array<int, 3>> g[200000];
bool check[200000];
pair<int, int> p;

inline void DFS(int node, int par)
{
    f[node] = 0;
    pre_node[node] = par;
    best_leave[node] = node;
    best_val[node] = 0;
    for (auto &i : g[node])
    {
        if (i[0] != par)
        {
            DFS(i[0], node);
            f[node] += f[i[0]] + i[2];
            if (best_val[i[0]] + i[1] > best_val[node])
            {
                best_val[node] = best_val[i[0]] + i[1];
                best_leave[node] = best_leave[i[0]];
            }
        }
    }
}

inline void DFS1(int node, int par, long long pre, int leave, long long val)
{
    pair<int, long long> one = {leave, val}, two = {-1, 0};
    res[1] = max(res[1], f[node] + pre);
    if (f[node] + pre + val > res[2])
    {
        p = {node, leave};
        res[2] = f[node] + pre + val;
    }
    for (auto &i : g[node])
    {
        if (i[0] != par)
        {
            if (best_val[i[0]] + i[1] >= one.second)
            {
                two = one;
                one = {best_leave[i[0]], best_val[i[0]] + i[1]};
            }
            else if (best_val[i[0]] + i[1] >= two.second)
            {
                two = {best_leave[i[0]], best_val[i[0]] + i[1]};
            }
        }
    }
    for (auto &i : g[node])
    {
        if (i[0] != par)
        {
            if (best_leave[i[0]] == one.first)
            {
                DFS1(i[0], node, pre + f[node] - f[i[0]] - i[2] + i[1], two.first, two.second + i[2]);
            }
            else
            {
                DFS1(i[0], node, pre + f[node] - f[i[0]] - i[2] + i[1], one.first, one.second + i[2]);
            }
        }
    }
}

inline void Process(int node)
{
    long long cur;
    priority_queue<pair<int, int>> pq;
    pair<long long, int> temp;

    DFS(node, node);
    cur = f[node];
    fill_n(check, n, 0);

    pq.push({-best_val[node], best_leave[node]});
    for (int i = 2; i <= n; ++i)
    {
        if (!pq.empty())
        {
            temp = pq.top();
            pq.pop();
            cur += -temp.first;
            a = temp.second;
            while (!check[a])
            {
                check[a] = true;
                for (auto &j : g[a])
                {
                    if (!check[j[0]])
                    {
                        pq.push({-best_val[j[0]], best_leave[j[0]] + j[1]});
                    }
                }
                a = pre_node[a];
            }
        }
        res[i] = max(res[i], cur);
    }
}

int main()
{
    setup();

    cin >> n;
    for (int i = 0; i < n - 1; ++i)
    {
        cin >> a >> b >> c >> d;
        g[a - 1].push_back({b - 1, c, d});
        g[b - 1].push_back({a - 1, d, c});
        all += c + d;
    }
    DFS(0, 0);
    DFS1(0, 0, 0, 0, 0);
    Process(p.first);
    Process(p.second);
    cin >> q;
    while (q--)
    {
        cin >> a;
        cout << all - res[a] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...