Submission #1149404

#TimeUsernameProblemLanguageResultExecution timeMemory
1149404SalihSahin꿈 (IOI13_dreaming)C++20
100 / 100
63 ms12876 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, mxi;

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[]) {
    priority_queue<int> pq;

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

    int ans = 0;
    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;

        // a -> b
        int best = dis[b], node = b;
        while(true){
            best = min(best, max(dis[node], dis[b] - dis[node]));
            if(node == p[node]) break;
            node = p[node];
        }

        ans = max(ans, dis[b]);
        pq.push(best);
    }

    if(pq.size() == 1){
        ans = max(ans, pq.top());
    }
    else if(pq.size() == 2){
        int sum = 0;
        while(pq.size()){
            sum += pq.top();
            pq.pop();
        }
        sum += L;
        ans = max(ans, sum);
    }
    else{
        int mx1 = pq.top();
        pq.pop();
        int mx2 = pq.top();
        pq.pop();
        int mx3 = pq.top();
        pq.pop();

        ans = max({ans, 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...