Submission #447211

#TimeUsernameProblemLanguageResultExecution timeMemory
447211definitelynotmeeRace (IOI11_race)C++98
100 / 100
1147 ms62956 KiB
#include<bits/stdc++.h>
#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second
using namespace std;
template <typename T>
using matrix = vector<vector<T>>;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll INFL = (1LL<<62)-1;
const int INF = (1<<30)-1;
const double EPS = 1e-7;
const int MOD = 1e9 + 7;
const int MAXN = 1e6+1;



int best_path(int n, int k, int h[][2], int l[]){

    vector<int> check(n,0);
    matrix<pii> grafo(n);
    for(int i = 0; i < n-1; i++)
        grafo[h[i][0]].push_back({h[i][1],l[i]}), grafo[h[i][1]].push_back({h[i][0],l[i]});
    
    int centroid;
    function<int(int,int,int)> dfsc = [&](int id, int last, int sizee){
        int ret = 1, maxi = 0;
        for(int i = 0; i < grafo[id].size(); i++){
            pii viz = grafo[id][i];
            if(viz.ff == last || check[viz.ff])
                continue;
            int cur = dfsc(viz.ff,id,sizee);
            ret+=cur;
            maxi = max(maxi,cur);
        }
        maxi = max(maxi,sizee-ret);
        if(maxi <= sizee/2)
            centroid =  id;
        return ret;
    };
    function<int(int,int,int,int,vector<pii>&v)> dfsd = [&](int id, int last, int ct, int dist, vector<pii>&v){
        if(dist > 1e7)
            dist = 1e7;
        v.push_back({ct,dist});
        int ret = 1;
        for(int i = 0; i < grafo[id].size(); i++){
            pii viz = grafo[id][i];
            if(viz.ff == last || check[viz.ff])
                continue;
            ret+=dfsd(viz.ff,id,ct+1,dist+viz.ss,v);

        }
        
        return ret;
    };
    int resp = INF;
    function<void(int,int)> findcentroid = [&](int id, int sizee){
        dfsc(id,-1,sizee);
        int curc = centroid;
        check[curc] = 1;
        map<int,int> m;

        for(int i = 0; i < grafo[curc].size(); i++){
            if(check[grafo[curc][i].ff])
                continue;
            vector<pii> dlist;
            int subtree = dfsd(grafo[curc][i].ff,-1,1,grafo[curc][i].ss,dlist);
            for(pii j : dlist){
                if(m.count(k-j.ss))
                    resp = min(resp,m[k-j.ss]+j.ff);
            }
            for(pii j : dlist){
                if(m.count(j.ss))
                    m[j.ss] = min(m[j.ss],j.ff);
                else m[j.ss] = j.ff;
            }
            findcentroid(grafo[curc][i].ff,subtree);
        }
        if(m.count(k))
            resp = min(resp,m[k]);
        
    };
    findcentroid(0,n);
    if(resp == INF)
        return -1;
    return resp;
}

Compilation message (stderr)

race.cpp: In lambda function:
race.cpp:30:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |         for(int i = 0; i < grafo[id].size(); i++){
      |                        ~~^~~~~~~~~~~~~~~~~~
race.cpp: In lambda function:
race.cpp:48:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |         for(int i = 0; i < grafo[id].size(); i++){
      |                        ~~^~~~~~~~~~~~~~~~~~
race.cpp: In lambda function:
race.cpp:65:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         for(int i = 0; i < grafo[curc].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...