Submission #1149396

#TimeUsernameProblemLanguageResultExecution timeMemory
1149396SalihSahinDreaming (IOI13_dreaming)C++20
18 / 100
30 ms12096 KiB
#include<bits/stdc++.h>
#include "dreaming.h"
#define pb push_back
using namespace std;

const int MAXN = 1e5 + 5;

vector<pair<int, int> > adj[MAXN];
vector<int> dis(MAXN), vis(MAXN), p(MAXN);

int mx = -1, mxi = -1;

void dfs(int node, int par, int len){
    p[node] = par;
    dis[node] = len;
    vis[node] = 1;

    if(dis[node] > mx){
        mx = dis[node];
        mxi = node;
    }

    for(auto itr: adj[node]){
        if(itr.first != par){
            dfs(itr.first, node, len + itr.second);
        }
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    multiset<int> mset;

    for(int i = 0; i < M; i++){
        adj[A[i]].pb({B[i], T[i]});
        adj[B[i]].pb({A[i], T[i]});
    }

    for(int i = 0; i < N; i++){
        if(vis[i]) continue;
        mx = mxi = -1;
        dfs(i, i, 0);
        int a = mxi;
        mx = mxi = -1;
        dfs(a, a, 0);
        int b = mxi;
        // b -> a
        int best = mx, node = b;
        while(node != p[node]){
            best = min(best, max(dis[node], mx - dis[node]));
            node = p[node];
        }

        mset.insert(best);
    }

    if(mset.size() == 1){
        return (*mset.begin());
    }
    else if(mset.size() == 2){
        int sum = 0;
        for(auto itr: mset) sum += itr;
        sum += L;
        return sum;
    }
    else{
        auto lst = mset.end();
        lst--;
        int mx1 = *lst;
        lst--;
        int mx2 = *lst;
        lst--;
        int mx3 = *lst;

        int ans = max(mx1 + mx2 + L, mx2 + mx3 + 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...