Submission #585395

#TimeUsernameProblemLanguageResultExecution timeMemory
585395MrDebooRace (IOI11_race)C++17
100 / 100
446 ms130800 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>>vct[500000];
pair<pair<long long,long long>,map<long long,long long>>pr[500000];
long long ans=LONG_LONG_MAX,k;
vector<int>viss(500000);
int cnt=0;
void dfs(int in){
    cnt++;
    assert(!viss[in]);
    viss[in]=1;
    if(vct[in].empty()){
        pr[in].second[0]=0;
        return;
    }
    for(auto &i:vct[in])dfs(i.first);
    int f=0,g=0;
    for(int i=0;i<vct[in].size();i++){
        if(pr[vct[in][i].first].second.size()>f){
            f=pr[vct[in][i].first].second.size();
            g=i;
        }
    }
    swap(pr[in],pr[vct[in][g].first]);
    pr[in].first.first+=vct[in][g].second;
    pr[in].first.second++;
    if(!pr[in].second.count(-pr[in].first.first))pr[in].second[-pr[in].first.first]=-pr[in].first.second;
    else pr[in].second[-pr[in].first.first]=min(pr[in].second[-pr[in].first.first],-pr[in].first.second);
    if(pr[in].second.count(k-pr[in].first.first)){
        ans=min(ans,(long long)pr[in].second[k-pr[in].first.first]+pr[in].first.second);
    }
    for(int i=0;i<vct[in].size();i++){
        if(i==g)continue;
        vector<pair<long long,long long>>V;
        for(auto &w:pr[vct[in][i].first].second){
            long long a=w.first+pr[vct[in][i].first].first.first+vct[in][i].second,b=w.second+pr[vct[in][i].first].first.second+1;
            long long G=k-a-pr[in].first.first;
            if(pr[in].second.count(G)){
                ans=min(ans,(long long)pr[in].second[G]+pr[in].first.second+b);
            }
            a-=pr[in].first.first,b-=pr[in].first.second;
            V.push_back({a,b});
        }
        for(auto &w:V){
            if(!pr[in].second.count(w.first))pr[in].second[w.first]=w.second;
            else pr[in].second[w.first]=min(pr[in].second[w.first],w.second);
        }
    }
}
int best_path(int n, int K, int h[][2], int l[]){
    k=K;
    vector<pair<int,int>>vec[n];
    for(int i=0;i<n-1;i++){
        vec[h[i][0]].push_back({h[i][1],l[i]});
        vec[h[i][1]].push_back({h[i][0],l[i]});
    }
    deque<int>dq={0};
    vector<bool>vis(n);
    vis[0]=1;
    int c=0;
    while(dq.size()){
        c++;
        int a=dq.front();
        dq.pop_front();
        for(auto &i:vec[a]){
            if(!vis[i.first]){
                vis[i.first]=1;
                vct[a].push_back(i);
                dq.push_back(i.first);
            }
        }
    }
    assert(c==n);
    dfs(0);
    return (ans==LONG_LONG_MAX?-1:ans);
}

Compilation message (stderr)

race.cpp: In function 'void dfs(int)':
race.cpp:19:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i=0;i<vct[in].size();i++){
      |                 ~^~~~~~~~~~~~~~~
race.cpp:20:46: warning: comparison of integer expressions of different signedness: 'std::map<long long int, long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   20 |         if(pr[vct[in][i].first].second.size()>f){
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
race.cpp:33:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |     for(int i=0;i<vct[in].size();i++){
      |                 ~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...