Submission #67959

#TimeUsernameProblemLanguageResultExecution timeMemory
67959andy627Dreaming (IOI13_dreaming)C++17
100 / 100
127 ms15608 KiB
#include "dreaming.h"

#include <stdio.h>
#include <vector>
#include <algorithm>
#define pii pair<int,int>
#define ff first
#define ss second
#define INF 2e9
using namespace std;

vector<pii> edge[111111];
bool used[111111],is_gone[111111];

int dist[111111],path[111111];
vector<pii> vc_d;

vector<int> vc_r;

pii dfs_mx(int v){
    pii mx={0,v};

    is_gone[v]=1; used[v]=1;
    for(int i=0;i<edge[v].size();i++){
        if(is_gone[edge[v][i].ff]) continue;
        dist[edge[v][i].ff]=dist[v]+edge[v][i].ss;

        pii res=dfs_mx(edge[v][i].ff);
        if(mx.ff<res.ff+edge[v][i].ss){
            mx.ff=res.ff+edge[v][i].ss;
            mx.ss=res.ss;
        }
    }
    is_gone[v]=0;
    path[v]=mx.ss;

    return mx;
}

void line(int v,int far){
    if(path[v]!=far) return;
    vc_d.push_back({dist[v],v});

    is_gone[v]=1;
    for(int i=0;i<edge[v].size();i++){
        if(is_gone[edge[v][i].ff]) continue;
        line(edge[v][i].ff,far);
    }
    is_gone[v]=0;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for(int i=0;i<M;i++){
        edge[A[i]].push_back({B[i],T[i]});
        edge[B[i]].push_back({A[i],T[i]});
    }

    int ans=0;
    for(int i=0;i<N;i++){
        if(used[i]) continue;

        dist[i]=0;
        int rt=dfs_mx(i).ss;

        dist[rt]=0;
        pii res=dfs_mx(rt);
        int d=res.ff,far=res.ss; ans=max(ans,d);

        line(rt,far);

        int mn=INF;
        for(auto v:vc_d) mn=min(mn,max(v.ff,d-v.ff));
        vc_r.push_back(mn); vc_d.clear();
    }

    sort(vc_r.begin(),vc_r.end());

    int siz=vc_r.size();
    if(siz>=2) ans=max(ans,vc_r[siz-1]+vc_r[siz-2]+L);
    if(siz>=3) ans=max(ans,vc_r[siz-2]+vc_r[siz-3]+(L<<1));

    return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'std::pair<int, int> dfs_mx(int)':
dreaming.cpp:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<edge[v].size();i++){
                 ~^~~~~~~~~~~~~~~
dreaming.cpp: In function 'void line(int, int)':
dreaming.cpp:45:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<edge[v].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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...