제출 #1268255

#제출 시각아이디문제언어결과실행 시간메모리
1268255wedkaRace (IOI11_race)C++20
100 / 100
377 ms104068 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]) {
            if(mp[s].find(k-pr.first+2*sum[s]) != mp[s].end()) {
                ans = min(ans, mp[s][k-pr.first + 2*sum[s]] + pr.second - 2*depth[s]);
            }
        }
        for(auto pr : mp[u]) {
            if(mp[s].find(pr.first) == mp[s].end()) {
                mp[s].insert(pr);
            }
            else {
                mp[s][pr.first] = min(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;
}

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

    int N,K;
    cin >> N >> K;
    int H[N-1][2];
    int L[N-1];
    for(int i = 0; i < N-1; i++) {
        int a,b;
        cin >> a >> b;
        H[i][0] = a;
        H[i][1] = b;
    }
    for(int i = 0; i < N-1; i++) {
        int w;
        cin >> w;
        L[i] = w;
    }
    cout << best_path(N,K,H,L) << '\n';
}*/

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