제출 #1344519

#제출 시각아이디문제언어결과실행 시간메모리
1344519yhx3경주 (Race) (IOI11_race)C++20
0 / 100
0 ms348 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
 
// #define int long long
#define ll long long
#define mkp(a,b) make_pair(a,b)
#define rep(i,a,b) for (int i = a; i < b; i++)
#define rrep(i,a,b) for (int i = a; i >= b; i--)
 
array<ll,3> mods = {1000000007,998244353,676767677};
ll MD = mods[2];
ll MX_ll = 1e18;
ll MX_VL = 2e9;
ll GN = 1e5+10;
 

vector<map<ll,ll>> sums;
ll res = MX_VL;
vector<ll> smdist;
vector<ll> dist;
void dfs(vector<vector<pair<ll,ll>>>& TREE,ll ind,ll par,ll& k) {
    sums[ind][smdist[ind]] = dist[ind];
    for(auto [child,len]:TREE[ind]) {
        if(child==par)continue;
        dfs(TREE,child,ind,k);
        if(sums[child].size() > sums[ind].size()) {
            swap(sums[child],sums[ind]);
        }
        for(auto [sum,price]:sums[child]) {
            ll targ = k+2*smdist[ind]-sum;
            if(sums[ind].find(targ)!=sums[ind].end()) {
                ll cost = price+sums[ind][targ]-2*dist[ind];
                res = min(res,cost);
            }
        }
        for(auto [sum,price]:sums[child]) {
            if(sums[ind].find(sum)!=sums[ind].end()) {
                sums[ind][sum] = min(sums[ind][sum],price);
            } else {
                sums[ind][sum] = price;
            }
        }
    }
}

void dfs1(vector<vector<pair<ll,ll>>>& TREE,ll ind,ll par,ll h,ll k) {
    dist[ind] = k;
    smdist[ind] = h;
    for(auto [ch,x]:TREE[ind]) {
      if(ch==par)continue;
        dfs1(TREE,ch,ind,h+x,k+1);
    }
}

int best_path(int N,int K,int edges[][2],int L[]) {
    ll n = N;
    ll k = K;
    vector<vector<pair<ll,ll>>> TREE(n,vector<pair<ll,ll>>());
    sums.resize(n);
    smdist.resize(n);
    dist.resize(n);
    rep(i,0,n-1) {
        TREE[edges[i][0]].push_back(mkp(edges[i][1],L[i]));
        TREE[edges[i][1]].push_back(mkp(edges[i][0],L[i]));
    }
    dfs1(TREE,0,-1,0,0);
    dfs(TREE,0,-1,k);
    if(res==MX_ll) return -1;
    return res;
}

// ll H[200000][2];
// int L[200000];

// signed main()
// {
//   int N,K;
//   cin>>N>>K;
//   int ans;
//   rep(i,0,N-1) {
//     cin>>H[i][0]>>H[i][1];
//   }
//   rep(i,0,N-1) cin>>L[i];
//   ans = best_path(N,K,H,L);
//   cout<<ans<<endl;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...