Submission #624532

#TimeUsernameProblemLanguageResultExecution timeMemory
624532DAleksaDreaming (IOI13_dreaming)C++17
100 / 100
113 ms16532 KiB
#include <bits/stdc++.h>
#include "dreaming.h"

using namespace std;

struct edge {
    int v;
    int w;
};

const int N = 1e5 + 10;
vector<edge> g[N];
bool mark[N];
int dist[N];
vector<int> component;
int tin[N], tout[N], timer;
int mn;

void dfs(int u) {
    if(mark[u]) return;
    component.push_back(u);
    mark[u] = true;
    for(auto v : g[u]) {
        if(mark[v.v]) continue;
        dist[v.v] = dist[u] + v.w;
        dfs(v.v);
    }
}

void dfs2(int u, int par) {
    tin[u] = timer++;
    for(auto v : g[u]) {
        if(v.v == par) continue;
        dfs2(v.v, u);
    }
    tout[u] = timer++;
}

bool is_ancestor(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; }

void dfs3(int u, int par, int x) {
    if(is_ancestor(u, x)) mn = min(mn, max(dist[u], dist[x] - dist[u]));
    for(auto v : g[u]) {
        if(v.v == par) continue;
        dfs3(v.v, u, x);
    }
}

int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    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]});
    }
    vector<int> W, W2;
    for(int i = 0; i < n; i++) {
        if(mark[i]) continue;
        component.clear();
        dfs(i);
        int mx = i;
        for(int j : component) if(dist[j] > dist[mx]) mx = j;
        for(int j : component) {
            dist[j] = 0;
            mark[j] = false;
        }
        component.clear();
        dfs(mx);
        int u, v;
        u = mx;
        mx = i;
        for(int j : component) if(dist[j] > dist[mx]) mx = j;
        v = mx;
        W.push_back(dist[mx]);
        dfs2(u, -1);
        mn = INT_MAX;
        dfs3(u, -1, v);
        W2.push_back(mn);
    }
    int res = 0;
    for(int i : W) res = max(res, i);
    sort(W2.rbegin(), W2.rend());
    if(W2.size() >= 2) res = max(res, W2[0] + W2[1] + l);
    if(W2.size() >= 3) res = max(res, W2[1] + W2[2] + 2 * l);
    return res;
}
#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...