제출 #1361268

#제출 시각아이디문제언어결과실행 시간메모리
1361268shrimb경주 (Race) (IOI11_race)C++20
100 / 100
257 ms73244 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;

vector<pair<int,int>>v[maxn];
map<int,int>mp[maxn]; // {v, dist, min dep}
int dep[maxn], dist[maxn], ans, k;

void check(int v, int depa, int dista)
{
    int distb = k+(2*dist[v])-dista;
    if(mp[v].count(distb))
    {
        int depb = mp[v][distb];
        ans = min(ans, depa+depb-(2*dep[v]));
    }
}

void add(int v, int depa, int dista)
{
    if(mp[v].count(dista)) mp[v][dista]=min(mp[v][dista], depa);
    else mp[v][dista]=depa;
}

void dfs(int cur, int pa)
{
    dep[cur]=dep[pa]+1;
    int m = -1;
    for(auto [i, c] : v[cur])
    {
        if(i!=pa)
        {
            dist[i]= dist[cur]+c;
            dfs(i, cur);
            if(m==-1|| mp[m].size() < mp[i].size()) m=i;
        }
    }
    if(m!=-1) swap(mp[m], mp[cur]);
    check(cur, dep[cur], dist[cur]);
    add(cur, dep[cur], dist[cur]);
    for(auto [i, c] : v[cur])
    {
        if(i!=pa&&i!=m)
        {
            for(auto [dista, depa] : mp[i])
            {
                check(cur, depa, dista);
            }
            for(auto [dista, depa] : mp[i])
            {
                add(cur, depa, dista);
            }
        }
    }
}

int best_path(int n, int K, int h[][2], int l[])
{
    k = K;
    ans=n;
    for(int i = 0; i < n-1; i++)
    {
        int a = h[i][0], b = h[i][1];
        v[a].push_back({b, l[i]});
        v[b].push_back({a, l[i]});
    }
    
    dfs(0,n);
    
    return (ans==n?-1:ans);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…