Submission #1004695

#TimeUsernameProblemLanguageResultExecution timeMemory
1004695GrayDreaming (IOI13_dreaming)C++17
32 / 100
49 ms21080 KiB
#include "dreaming.h"
#include <algorithm>
#include <iostream>
#include <vector>

#define ll long long
#define ff first
#define ss second
#define ln "\n"

using namespace std;
vector<pair<ll, pair<ll, ll>>> e;
vector<vector<ll>> A;
vector<vector<ll>> dp;
vector<ll> stmp;
vector<bool> vis;
ll n, m, l;
void dfs(ll u, ll p){
    vis[u]=1;
    if (A[u].size()==1 and u!=p){
        dp[u] = {0};
    }
    for (auto i:A[u]){
        ll v = e[i].ss.ff^e[i].ss.ss^u;
        if (v==p) continue;
        dfs(v, u);
        for (auto ch:dp[v]){
            dp[u].push_back(ch+e[i].ff);
        }
    }
    sort(dp[u].rbegin(), dp[u].rend());
    while (dp[u].size()>2) dp[u].pop_back();
}
void dfs2(ll u, ll p, ll &diam, ll &big, ll pass){
    // cout << u << endl;
    dp[u].push_back(pass);
    sort(dp[u].rbegin(), dp[u].rend());
    while (dp[u].size()>2) dp[u].pop_back();
    for (auto i:A[u]){
        ll v = e[i].ss.ff^e[i].ss.ss^u;
        if (v==p) continue;
        if (dp[u][0]==dp[v][0]+e[i].ff){
            dfs2(v, u, diam, big, dp[u][1]+e[i].ff);
        }else{
            dfs2(v, u, diam, big, dp[u][0]+e[i].ff);
        }
    }
    // cout << u << " <> " << dp[u][0] << ln;
    if (dp[u].size()==1){
        diam=max(diam, dp[u][0]);
        big=0;
        return;
    }
    diam=max(diam, dp[u][0]+dp[u][1]);
    big=min(big, dp[u][0]);
}
pair<ll, ll> fout(ll mem){
    dfs(mem, mem);
    ll diam=0, big=2e18;
    dfs2(mem, mem, diam, big, 0);
    // cout << mem << " -> " << diam << " " << big << endl;
    return {diam, big};
}
int travelTime(int N, int M, int L, int U[], int V[], int W[]) {
    n=N; m=M; l=L;
    // cout << N << " " << M << " " << L << ln;return 0;
    e.resize(m);
    A.resize(n);
    dp.resize(n);
    vis.resize(n);
    // return 0;
    for (ll i=0; i<m; i++){
        A[U[i]].push_back(i);
        A[V[i]].push_back(i);
        e[i] = {W[i], {U[i], V[i]}};
    }
    ll ans=0;
    vector<ll> bigs;
    for (ll i=0; i<n; i++){
        // cout << i << ":";
        if (!vis[i]){
            // cout << i << endl;
            auto ret = fout(i);
            ans=max(ans, ret.ff);
            bigs.push_back(ret.ss);
        }
    }
    sort(bigs.rbegin(), bigs.rend());
    ans=max(ans, bigs[0]);
    if (bigs.size()>1){
        ans=max(ans, bigs[0]+bigs[1]+l);
    }
    if (bigs.size()>2){
        ans=max(ans, bigs[1]+bigs[2]+2*l);
    }
    return 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...