Submission #1368230

#TimeUsernameProblemLanguageResultExecution timeMemory
13682303lektraDreaming (IOI13_dreaming)C++20
18 / 100
33 ms14868 KiB
#include<bits/stdc++.h>
#include "dreaming.h"
using namespace std;

const int maxN = 1e5;
vector<vector<pair<int,int>>> graph(maxN);
vector<int> dis1, dis2, dis0;
vector<bool> vis;
string wa;

pair<int,int> dfs(int node, int par, vector<int>&dis){
    pair<int,int> lejos = {node, dis[node]};
    pair<int,int> comp;
    for(auto u : graph[node]){
        if(dis[u.first] == -1){
            dis[u.first]=dis[node]+u.second;
            comp = dfs(u.first, node, dis);
            if(comp.second > lejos.second) lejos = comp;
        }
    }
    return lejos;
}

int find_mid(int node, int&sz){
    int ans = 1e9+83;
    vis[node] = true;
    if(dis1[node]+dis2[node]==sz) ans = min(ans, max(dis1[node], dis2[node]));
    for(auto u : graph[node]) if(!vis[u.first]) ans = min(ans, find_mid(u.first, sz));
    //if(ans == 1e9+83) return 0;
    return ans;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]){
    // Fixing whatever this "input" is supposed to be
    for(int i = 0; i < M; ++i){
        graph[A[i]].push_back({B[i], T[i]});
        graph[B[i]].push_back({A[i], T[i]});
    }
    pair<int,int> p;
    int ans;
    dis0 = dis1 = dis2 = vector<int>(N, -1);
    vis = vector<bool>(N, false);
    vector<int> r;
    for(int i = 0; i < N; ++i){
        if(dis0[i] == -1){
            dis0[i] = 0;
            p = dfs(i,i, dis0);
            dis1[p.first] = 0;
            p = dfs(p.first, p.first, dis1);
            dis2[p.first] = 0;
            p = dfs(p.first, p.first, dis2);
            vis[p.first] = true;
            ans = find_mid(p.first, p.second);
            r.push_back(ans);
        }
    }

    sort(r.begin(), r.end()); reverse(r.begin(), r.end());

    ans = 0;
    if(r.size() >= 2) ans = max(ans, r[0]+r[1]+L);
    if(r.size() >= 3) ans = max(ans, r[1]+r[2]+2*L);
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...