Submission #120276

#TimeUsernameProblemLanguageResultExecution timeMemory
120276turbatDreaming (IOI13_dreaming)C++14
100 / 100
132 ms17144 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
using pii = pair <int, int>;
using vi = vector <int>;
#define F first
#define S second
#define mp make_pair
#define pb push_back
#define N 100005
vector <pii> edg[N];
vector <int> se;
int dist, dp[N], dp1[N], up[N], up1[N], ans, f[N];
int vis[N];
void dfs(int u){
    vis[u] = 1;
    for (pii v : edg[u])
        if (!vis[v.F]){
            dfs(v.F);
            if (dp[u] < dp[v.F] + v.S) {
                dp1[u] = dp[u];
                f[u] = v.F;
                dp[u] = dp[v.F] + v.S;
            }
            else if (dp1[u] < dp[v.F] + v.S) dp1[u] = dp[v.F] + v.S;
        }
}
void dfs1(int u, int mx){
    vis[u] = 2;
    if (up[u] < mx){
        up1[u] = up[u];
        up[u] = mx;
    }
    else if (up1[u] < mx) up1[u] = mx;
    for (int i = edg[u].size() - 1;i >= 0;i--){
        pii v = edg[u][i];
        if (vis[v.F] < 2){
            if (f[u] == v.F) dfs1(v.F, max(mx, dp1[u]) + v.S);
            else dfs1(v.F, max(mx, dp[u]) + v.S);
        }
    }
    ans = max({ans, dp[u] + dp1[u], up[u] + up1[u], dp[u] + up[u]});
    // cout << u << ' ' << dp[u] << ' ' << dp1[u] << ' '<< up[u]<< ' '<< up1[u]<<endl;
    dist = min(dist, max({dp[u], dp1[u], up[u], up1[u]}));
}
int travelTime(int n, int m, int L, int A[], int B[], int T[]) {
    for (int i = 0;i < m;i++){
        edg[A[i]].pb(mp(B[i], T[i]));
        edg[B[i]].pb(mp(A[i], T[i]));
    }
    int k = 0;
    for (int i = 0;i < n;i++)
        if (!vis[i]){
            k++;
            dist = 1e9;
            dfs(i);
            // cout << "###################\n"<< i << endl;
            dfs1(i, 0);
            se.pb(dist);
        }
    sort(se.begin(), se.end());
    if (se.size() == 1) return ans;
    if (se.size() == 2) return max(ans, se[0] + se[1] + L);
    return max({se.back() + se[k - 2] + L, se[k - 2] + se[k - 3] + 2 * L, 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...