Submission #1313747

#TimeUsernameProblemLanguageResultExecution timeMemory
1313747husseinjuandaDreaming (IOI13_dreaming)C++20
100 / 100
50 ms22208 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long

vector<ll> dp;
vector<vector<pair<ll, ll>>> g;
vector<ll> d;
vector<ll> h;

void dfs(int k, int p){
    d[k] = 1;
    for(int y = 0; y < g[k].size(); y++){
        if(g[k][y].first == p) continue;
        dfs(g[k][y].first, k);
        dp[k] = max(dp[k], dp[g[k][y].first]+g[k][y].second);
    }
}

ll m = 2e18;
ll mmx = 0;

void reroot(ll k, ll p, ll up){
    ll mx = 0;
    ll mx1 = 0;
    for(int y = 0; y < g[k].size(); y++){
        if(g[k][y].first == p) continue;
        if(mx < dp[g[k][y].first] + g[k][y].second){
            mx1 = mx;
            mx = dp[g[k][y].first] + g[k][y].second;
        }else{
            mx1 = max(mx1, dp[g[k][y].first] + g[k][y].second);
        }
    }
    h[k] = max(dp[k], up);
    for(int y = 0; y < g[k].size(); y++){
        if(g[k][y].first == p) continue;
        if(mx == dp[g[k][y].first]+g[k][y].second){
            reroot(g[k][y].first, k, max(mx1, up)+g[k][y].second);
        }else{
            reroot(g[k][y].first, k, max(mx, up)+g[k][y].second);
        }
    }
    mmx = max(mmx, h[k]);
    m = min(m, h[k]);
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    g.clear();
    g.resize(N);
    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]});
    }
    mmx = 0;
    d.clear();
    d.resize(N);
    h.clear();
    h.resize(N);
    dp.clear();
    dp.resize(N);
    vector<ll> s;
    for(int i = 0; i < N; i++){
        if(d[i] == 1) continue;
        m = 2e18;
        dfs(i, -1);
        reroot(i, -1, 0);
        s.push_back(m);
        // cout << m << "\n";
    }
    sort(s.rbegin(), s.rend());
    if(s.size() >= 2){
        mmx = max(mmx, s[0] + s[1] + L);
    }
    if(s.size() >= 3){
        mmx = max(mmx, s[1] + s[2] + 2*L);
    }
    // cout << mn << " " << mmx << endl;
    return mmx;
}
#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...