Submission #331256

#TimeUsernameProblemLanguageResultExecution timeMemory
331256smaxDreaming (IOI13_dreaming)C++17
100 / 100
129 ms18796 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

int mx[100005], mx2[100005];
bool vis[100005];
vector<pair<int, int>> adj[100005];

int dfs1(int u, int p) {
    vis[u] = true;
    mx[u] = mx2[u] = 0;
    int ret = 0;
    for (auto [v, w] : adj[u])
        if (v != p) {
            ret = max(ret, dfs1(v, u));
            if (mx[v] + w >= mx[u]) {
                mx2[u] = mx[u];
                mx[u] = mx[v] + w;
            } else if (mx[v] + w > mx2[u]) {
                mx2[u] = mx[v] + w;
            }
        }
    return max(ret, mx[u] + mx2[u]);
}

int dfs2(int u, int p) {
    int ret = mx[u];
    for (auto [v, w] : adj[u])
        if (v != p) {
            int memo = mx[v], memo2 = mx2[v], nxt = (mx[v] + w == mx[u] ? mx2[u] : mx[u]) + w;
            if (nxt >= mx[v]) {
                mx2[v] = mx[v];
                mx[v] = nxt;
            } else if (nxt > mx2[v]) {
                mx2[v] = nxt;
            }
            ret = min(ret, dfs2(v, u));
            mx[v] = memo;
            mx2[v] = memo2;
        }
    return ret;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for (int i=0; i<N; i++) {
        vis[i] = false;
        adj[i].clear();
    }
    for (int i=0; i<M; i++) {
        adj[A[i]].emplace_back(B[i], T[i]);
        adj[B[i]].emplace_back(A[i], T[i]);
    }

    vector<pair<int, int>> comp;
    for (int i=0; i<N; i++)
        if (!vis[i]) {
            int d = dfs1(i, -1), mxD = dfs2(i, -1);
            comp.emplace_back(mxD, d);
        }
    sort(comp.rbegin(), comp.rend());

    int ret = comp[0].second, mxD = comp[0].first;
    for (int i=1; i<(int)comp.size(); i++) {
        ret = max({ret, comp[i].first + mxD + L, comp[i].second});
        mxD = max(mxD, comp[i].first + L);
    }
    return ret;
}
#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...