제출 #1268244

#제출 시각아이디문제언어결과실행 시간메모리
1268244wedka경주 (Race) (IOI11_race)C++20
9 / 100
151 ms53360 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxN = 2e5+5;
ll INF = 1e9;
ll sum[maxN];
ll depth[maxN];
vector<vector<pair<ll,ll>>> adj(maxN);
vector<map<ll,ll>> mp(maxN);
ll k,n;
ll ans;

void dfs1(int s, int p) {
    depth[s] = depth[p]+1;
    mp[s][sum[s]] = depth[s];
    for(auto [w,u] : adj[s]) {
        if(u == p) continue;
        sum[u] = sum[s]+w;
        dfs1(u,s);
    }
}

void dfs(int s, int p) {
    for(auto [w,u] : adj[s]) {
        if(u == p) continue;
        dfs(u,s);
        if(mp[u].size() > mp[s].size()) swap(mp[u],mp[s]);
        for(auto pr : mp[u]) {
            int cur = mp[s][k-pr.first + 2*sum[s]];
            if(cur != 0) {
                ans = min(ans,cur+pr.second - 2*depth[s]);
            }
        }
        for(auto pr : mp[u]) {
            if(mp[s][pr.first] == 0 || mp[s][pr.first] > pr.second) {
                mp[s][pr.first] = pr.second;
            }
        }
    }
}

ll best_path(int N, int K, int H[][2], int L[]) {
    n = N;
    k = K;
    ans = INF;
    for(int i = 0; i < N-1; i++) {
        ll a = H[i][0], b = H[i][1], w = L[i];
        adj[a].push_back({w,b});
        adj[b].push_back({w,a});
    }
    sum[0] = 0;
    depth[0] = 0;
    dfs1(0,0);
    dfs(0,0);
    if(ans == INF) return -1;
    return ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...