QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#425998#6102. Query on a TreeHKOI0#WA 0ms3516kbC++204.5kb2024-05-30 20:06:522024-05-30 20:06:52

Judging History

This is the latest submission verdict.

  • [2024-05-30 20:06:52]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3516kb
  • [2024-05-30 20:06:52]
  • Submitted

answer

#include <bits/stdc++.h>
#define int long long
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()

using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;

struct FunnyStruct {
    int n;
    vector<unordered_map<int, int>> g;
    
    vector<ll> mx, mx2;
    vector<int> opt;
    vector<ll> dp;

    ll curAns;
    int bestU, bestV;

    void dfs(int u, int p) {
        vector<pair<ll, int>> paths;
        for (auto& [v, w] : g[u]) {
            if (v == p) continue;
            dfs(v, u);
            dp[u] = max(dp[u], dp[v]);
            paths.emplace_back(mx[v] + w, v);
        }

        sort(paths.rbegin(), paths.rend());
        if ((int)paths.size() >= 1) {
            mx[u] = paths[0].first;
            opt[u] = paths[0].second;
            dp[u] = max(dp[u], paths[0].first);
        }

        if ((int)paths.size() >= 2) {
            mx2[u] = paths[1].first;
            dp[u] = max(dp[u], paths[0].first + paths[1].first);
        }
    }

    void dfs2(int u, int p) {
        for (auto& [v, w] : g[u]) {
            if (v == p) continue;

            const ll val = dp[v] + (v == opt[u] ? mx2[u] : mx[u]);
            cerr << "DELETE " << u + 1 << ' ' << v + 1 << ' ' << val << '\n';
            if (val > curAns) {
                curAns = val;
                bestU = u;
                bestV = v;
            }

            ll oldMxU = mx[u];
            mx[u] = (v == opt[u] ? mx2[u] : mx[u]);
            ll oldMxV = mx[v];
            ll oldMxV2 = mx2[v];
            mx[v] = max(mx[v], mx[u] + w);
            mx2[v] = max(mx2[v], mx2[u] + w);
            dfs2(v, u);

            mx2[v] = oldMxV2;
            mx[v] = oldMxV;
            mx[u] = oldMxU;
        }
    }

    FunnyStruct(int n, const vector<unordered_map<int, int>>& e) :
        n(n), g(e), mx(n), mx2(n), opt(n), dp(n) {
    }

    pair<int, int> solve(int u) {
        dfs(u, -1);

        cerr << "DP\n";
        for (int i = 0; i < (int)g.size(); i++)
            cerr << dp[i] << " \n"[i + 1 == (int)g.size()];
        for (int i = 0; i < (int)g.size(); i++)
            cerr << opt[i] << " \n"[i + 1 == (int)g.size()];

        curAns = -1;
        bestU = bestV = INT_MIN;
        dfs2(u, -1);

        assert(bestU != -1 && bestV != -1);
        return {bestU, bestV};
    }

    pair<int, ll> furthest(int u) {
        vector<ll> dist((int)g.size(), LLONG_MAX / 4);
        dist[u] = 0;
        
        queue<int> q;
        q.push(u);

        while (!q.empty()) {
            int v = q.front();
            q.pop();

            for (auto& [v2, w] : g[v]) {
                if (dist[v2] > dist[v] + w) {
                    dist[v2] = dist[v] + w;
                    q.push(v2);
                }
            }
        }

        int maxDistVertex = INT_MIN;
        ll maxDist = -1;
        for (int v = 0; v < (int)g.size(); v++) {
            if (dist[v] == LLONG_MAX / 4) continue;
            if (dist[v] > maxDist) {
                maxDist = dist[v];
                maxDistVertex = v;
            }
        }

        return {maxDistVertex, maxDist};
    }
};

void solve() {
    int n,k;
    cin>>n>>k;
    vector<unordered_map<int,int>> e(n);
    for(int i=0;i<n-1;i++) {
        int u,v,w;
        cin>>u>>v>>w;
        u--;
        v--;
        e[u].emplace(v,w);
        e[v].emplace(u,w);
    }
    vector<int> ans;
    {
        FunnyStruct g(n,e);
        auto [u,dis1]=g.furthest(0);
        auto [v,dis2]=g.furthest(u);
        ans.push_back(dis2);
    }

    for(int i=1;i<=k;i++) {
        FunnyStruct g(n,e);
        auto [u0,v0]=g.solve(0);
        int w=e[u0][v0];
        e[u0].erase(v0);
        e[v0].erase(u0);
        #ifdef LOCAL
        cout<<u0 + 1<<' '<<v0 + 1<<' '<<w<<'\n';
        #endif
        FunnyStruct ng(n,e);
        auto [u1,dis11]=ng.furthest(u0);
        auto [u2,dis12]=ng.furthest(u1);
        auto [v1,dis21]=ng.furthest(v0);
        auto [v2,dis22]=ng.furthest(v1);
        #ifdef LOCAL
        cout<<u1 + 1<< ' ' << v1 + 1<< ' ' << dis12<<' '<<dis22<<' '<<'\n';
        #endif
        ans.push_back(dis12+w+dis22);
        e[u1].emplace(v1,w);
        e[v1].emplace(u1,w);
    }

    for (auto x : ans) cout << x << ' ';
    cout << endl;
    // cout << "END" << endl;
}

signed main() {
#ifndef LOCAL
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    int T = 1;
    // cin >> T;
    while (T--) solve();
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3516kb

input:

7
1 2
1 3
1 5
2 7
4 6
4 7
6
1 1
2 1 2
4 1 2 3 4
5 1 2 4 6 7
6 1 2 3 4 5 6
7 1 2 3 4 5 6 7

output:

5 12 

result:

wrong answer 1st numbers differ - expected: '0', found: '5'