답안 #970036

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
970036 2024-04-26T07:10:55 Z lurhx 경주 (Race) (IOI11_race) C++17
0 / 100
1 ms 2392 KB
#include "race.h"

#include <bits/stdc++.h>
/*
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;*/
using namespace std;
#define ll long long
#define mp make_pair
#define f first
#define s second
const ll inf = 1e18;
vector<vector<pair<ll,ll>>> edges;
vector<bool> centroids;
vector<ll> sizes;
ll n,k;
ll get_size(ll node, ll parent = -1) {
    ll res = 1;
    for(auto i: edges[node]) {
        if(centroids[i.f] || i.f==parent)continue;
        res+=get_size(i.f,node);
    }
    return sizes[node]=res;
}
ll get_centroid(ll node,ll _n,ll parent = -1) {
    for(auto i: edges[node]) {
        if(centroids[i.f] || i.f == parent)continue;
        if(sizes[i.f]*2>_n)
            return get_centroid(i.f,_n,node);
    }
    return node;
}

vector<unordered_map<ll,ll>>dp;
void dfs(ll node,ll val,ll times,ll parent = -1) {
    if(dp.back().find(val)==dp.back().end())
        dp.back()[val] = times;
    else
        dp.back()[val] = min(dp.back()[val],times);
    for(auto i: edges[node]) {
        if(i.f==parent || centroids[i.f]) continue;
        dfs(i.f,val+i.s,times+1,node);
    }
}
ll solve(ll node,int _n) {
    //find centroid;
    dp.clear();
    get_size(node);
    ll centroid = get_centroid(node,_n);
    centroids[centroid] = true;
    for(auto i: edges[centroid]) {
        if(centroids[i.f])continue;
        dp.emplace_back();
        dfs(i.f,i.s,1);
    }
    ll ans = inf;
    unordered_map<ll,ll> another;
    for(auto i : dp) {
        for(auto q:i) {
            if(q.f==k)
                ans = min(ans,q.s);
            else {
                if(another.find(k-q.f)!=another.end())
                    ans = min(ans,another[k-q.f]+q.s);
                if(another.find(q.f)==another.end())
                    another[q.f] = q.s;
                else
                    another[q.f] = min(another[q.f],q.s);
            }
        }
    }
    //cout << dp.size() << endl;
    for(auto i: edges[centroid]) {
        if(!centroids[i.f])
            ans = min(ans,solve(i.f,sizes[i.f]));
    }
    return ans;
}

int best_path(int N, int K, int H[][2], int L[]){
    n = N;
    k = K;
    edges.resize(n);
    sizes.resize(n);
    centroids.resize(n);
    pair<ll,ll> in[n];
    ll len[n];
    for(int i = 0; i<n-1; i++) {
        in[i].f = H[i][0]; in[i].s = H[i][1]; len[i] = L[i];
        edges[in[i].f].emplace_back(in[i].s,len[i]);
        edges[in[i].s].emplace_back(in[i].f,len[i]);
    }
    ll _ = solve(0,n);
    if(_ == inf)
        _ =-1;
    return _;
}
/*
int main() {
    cin >> n >> k;
    edges.resize(n);
    sizes.resize(n);
    centroids.resize(n);
    pair<int,int> in[n];
    int len[n];
    for(int i = 0; i<n-1; i++) {
        cin >> in[i].f >> in[i].s >> len[i];
        edges[in[i].f].emplace_back(in[i].s,len[i]);
        edges[in[i].s].emplace_back(in[i].f,len[i]);
    }
    auto _ = solve(0);
    if(_ == inf)
        _ =-1;
    cout << _;
}*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2392 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2392 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2392 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2392 KB Output isn't correct
2 Halted 0 ms 0 KB -