Submission #605623

#TimeUsernameProblemLanguageResultExecution timeMemory
605623mychecksedad경주 (Race) (IOI11_race)C++17
9 / 100
237 ms55056 KiB
#include <bits/stdc++.h>
#include <race.h>
using namespace std;
typedef long long int ll;
const int M = 2e5 + 100;

struct Edge{
    int next;
    ll len; 
};

int n, sub[M];
ll val[M], depth[M], k, best;
vector<Edge> g[M];
map<ll, pair<bool, int>> a[M];



void dfs(int v, int p){
    int mx = 0, big = -1;
    for(Edge e: g[v]){
        if(e.next != p && sub[e.next] > mx){
            mx = sub[e.next];
            big = e.next;
        }
    }
    for(Edge e: g[v]){
        if(e.next != p && e.next != big)
            dfs(e.next, v);
    }
    if(big > -1)
        dfs(big, v), a[v].swap(a[big]);
    
    a[v][val[v]].first = 1;
    a[v][val[v]].second = depth[v];


    for(Edge e: g[v]){
        if(e.next != big && e.next != p){
            for(auto p: a[e.next]){
                if(a[v][k - p.first + 2 * val[v]].first == 1){
                	best = min(best, p.second.second + a[v][k - p.first + 2 * val[v]].second - depth[v] * 2);
                }
                if(a[v][p.first].first == 0){
                    a[v][p.first] = {1, p.second.second};
                }else a[v][p.first].second = min(a[v][p.first].second, p.second.second);
            }
        }
    }
    if(a[v][k + val[v]].first == 1){
    	best = min(best, a[v][k + val[v]].second - depth[v]);
    }
}


void init(int v, int p, ll d, int dd){
    sub[v] = 1;
    val[v] = d;
    depth[v] = dd;
    for(Edge e: g[v]){
        if(e.next != p){
            init(e.next, v, d + e.len, dd + 1);
            sub[v] += sub[e.next];
        }
    }
}


int best_path(int N, int K, int H[][2], int L[])
{
    best = N + 1;
    n = N;
    k = K;
    Edge e;
    for(int i = 0; i < n-1; ++i){
        e.next = H[i][1];
        e.len = L[i];
        g[H[i][0]].push_back(e);
        e.next = H[i][0];
        g[H[i][1]].push_back(e);
    }
    init(0, 0, 0, 0);
    dfs(0, 0);

    return (best == N+1 ? -1 : best);
}   

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