Submission #1024590

#TimeUsernameProblemLanguageResultExecution timeMemory
1024590socpiteDreaming (IOI13_dreaming)C++17
100 / 100
63 ms16644 KiB
#include "dreaming.h"
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+5;
const int INF = 1e9+5;

vector<pair<int, int>> g[maxn];

int d1[maxn], d2[maxn], vis[maxn];

vector<int> vec;

void pre_dfs(int x, int p){
    vis[x] = 1;
    vec.push_back(x);
    for(auto v: g[x]){
        if(v.first == p)continue;
        pre_dfs(v.first, x);
    }
}

void dfs(int x, int p, int* D){
    if(p == -1)D[x] = 0;
    for(auto v: g[x]){
        if(v.first == p)continue;
        D[v.first] = D[x] + v.second;
        dfs(v.first, x, D);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    int ans = 0;
    vector<int> hdm;
    for(int i = 0; i < M; i++){
        g[A[i]].push_back({B[i], T[i]});
        g[B[i]].push_back({A[i], T[i]});
    }
    for(int i = 0; i < N; i++){
        if(vis[i])continue;
        vec.clear();
        pre_dfs(i, -1);
        dfs(i, -1, d1);
        int rt1 = i;
        for(auto v: vec)if(d1[v] > d1[rt1])rt1 = v;
        dfs(rt1, -1, d1);
        int rt2 = i;
        for(auto v: vec)if(d1[v] > d1[rt2])rt2 = v;
        dfs(rt2, -1, d2);
        ans = max(ans, d1[rt2]);

        int mn = INF;
        for(auto v: vec){
            mn = min(mn, max(d1[v], d2[v]));
        }
        hdm.push_back(mn);
    }
    sort(hdm.rbegin(), hdm.rend());
    if(hdm.size() >= 2)ans = max(ans, hdm[0] + hdm[1] + L);
    if(hdm.size() >= 3)ans = max(ans, hdm[1] + hdm[2] + 2*L);
    return ans;
}
#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...