제출 #1360960

#제출 시각아이디문제언어결과실행 시간메모리
1360960eyadooz경주 (Race) (IOI11_race)C++20
0 / 100
1 ms344 KiB
#include<bits/stdc++.h>
#include "race.h"

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
#define endl '\n'
int k, cn=0, sub[200005], ans=INT_MAX, pref[200005], depth[200005];
vector<pii> adj[200005];
bool deleted[200005];
map<int, int> mn;
void dfs(int x, int p=-1) 
{
    cn++;
    sub[x]=1;
    for(auto[i, _] : adj[x]) 
    {
        if(!deleted[i]&&i!=p) {dfs(i, x);sub[x]+=sub[i];}
    }
}
int centr(int x, int p=-1) 
{
    for(auto[i, _] : adj[x]) 
    {
        if(i!=p&&!deleted[i]&&sub[i]>cn/2) return centr(i, x);
    }
    return x;
}
void init(int x, int p=-1) 
{
    for(auto[i, w] : adj[x]) 
    {
        if(i==p||deleted[i]) continue;
        pref[i]=pref[x]+w;
        depth[i]=depth[x]+1;
        init(i, x);
    }
}
void query(int x, int p=-1) 
{
    if(pref[x]==k) ans=min(ans, depth[x]);
    if(mn.count(k-pref[x])) ans=min(ans, mn[k-pref[x]]+depth[x]);
    for(auto[i, _]:adj[x]) 
    {
        if(i!=p&&!deleted[i]) query(i, x);
    }
}
void update(int x, int p=-1) 
{
    if(!mn.count(pref[x])) mn[pref[x]]=depth[x];
    else mn[pref[x]]=min(mn[pref[x]], depth[x]);
    for(auto[i, _]:adj[x]) 
    {
        if(i!=p&&!deleted[i]) update(i, x);
    }
}
void solve(int x) 
{
    mn.clear();
    mn[0]=0;
    pref[x]=0;
    depth[x]=0;
    init(x);
    for(auto[i, _] : adj[x]) 
    {
        if(deleted[i]) continue;
        query(i);
        update(i);
    }
}
void decompose(int v) 
{
    cn=0;
    dfs(v);
    int cen=centr(v);
    solve(cen);
    deleted[cen]=1;
    for(auto[i, _] : adj[cen]) 
    {
        if(!deleted[i]) decompose(i);
    }
}
int best_path(int N, int K, int H[][2], int L[])
{
    k=K;
    for(int i = 0;i < N-1;i++) 
    {
        auto[x, y]=H[i];
        auto w=L[i];
        adj[x].pb({y, w});
        adj[y].pb({x, w});
    }
    decompose(0);
    return (ans==INT_MAX?-1:ans);
}
// int main()
// {
//     cin.tie(0) -> sync_with_stdio(0);

//     // int h[2][2];
//     // h[0][0]=0;
//     // h[1][0]=1;
//     // // h[2][0]=1;


//     // h[0][1]=1;
//     // h[1][1]=2;
//     // // h[2][1]=3;
//     // int l[2];
//     // l[0]=1;
//     // l[1]=1;
//     // // l[2]=4;
//     cout << best_path(5, 3, h, l);    
// }
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…