Submission #970023

#TimeUsernameProblemLanguageResultExecution timeMemory
970023lurhxRace (IOI11_race)C++17
43 / 100
3062 ms46548 KiB
#include "race.h"

#include <bits/stdc++.h>
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;
    for(int i = 0; i<dp.size(); i++) {
        if(dp[i].find(k)!=dp[i].end())
            ans = min(ans,dp[i][k]);
        for(int j = i+1; j<dp.size(); j++) {
            for(auto q: dp[i]) {
                if(dp[j].find(k-q.f)!=dp[j].end())
                    ans = min(ans,q.s+dp[j][k-q.f]);
            }
        }
    }
    //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 << _;
}*/

Compilation message (stderr)

race.cpp: In function 'long long int solve(long long int, int)':
race.cpp:53:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::unordered_map<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     for(int i = 0; i<dp.size(); i++) {
      |                    ~^~~~~~~~~~
race.cpp:56:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::unordered_map<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for(int j = i+1; j<dp.size(); j++) {
      |                          ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...