Submission #1316629

#TimeUsernameProblemLanguageResultExecution timeMemory
1316629tsetsenbilegDreaming (IOI13_dreaming)C++20
0 / 100
36 ms17852 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pr = pair<int, int>;
#define pb push_back
const int INF = 1e9+7;
vector<vector<pr>> edge;
vector<int> dp;
int res = 0;

int dfs1(int node, int par) {
    int ans = 0;
    for (auto [next, val] : edge[node]) {
        if (next == par) continue;
        int t = dfs1(next, node);
        res = max(res, t + ans + val);
        ans = max(ans, t + val);
    }
    return dp[node] = ans;
}

int dfs2(int node, int par, int parv) {
    int sz = edge[node].size();
    int ans = parv;
    vector<int> pref(sz+1, 0), suff(sz+2, 0);
    for (int i = 0; i < sz; i++) {
        if (edge[node][i].first == par) continue;
        pref[i+1] = max(pref[i], dp[edge[node][i].first]);
    }
    for (int i = sz-1; i >= 0; i--) {
        if (edge[node][i].first == par) continue;
        suff[i+1] = max(suff[i+2], dp[edge[node][i].first]);
    }
    ans = max(ans, pref[sz]);
    for (int i = 0; i < sz; i++) {
        if (edge[node][i].first == par) continue;
        ans = min(ans, dfs2(edge[node][i].first, node, max({parv, pref[i], suff[i+2]})));
    }
    return ans;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    edge.resize(N);
    dp.assign(N, -1);
    for (int i = 0; i < M; i++) {
        edge[A[i]].pb({B[i], T[i]});
        edge[B[i]].pb({A[i], T[i]});
    }
    int mx = 0;
    for (int i = 0; i < N; i++) {
        if (dp[i] == -1) {
            dfs1(i, -1);
            int t = dfs2(i, -1, 0);
            res = max(res, mx + t + L);
            mx = max(mx, t);
        }
    }
    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...