Submission #1357639

#TimeUsernameProblemLanguageResultExecution timeMemory
1357639pcheloveksDreaming (IOI13_dreaming)C++20
100 / 100
70 ms16712 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

using pii = pair < int, int >;

const int DIM = 100007;

int n, m, l;
vector < pii > v[DIM];

bool used[DIM];

int dist[DIM];
void countDist(int val, int prev, int& v1) {
    if(dist[val] > dist[v1]) v1 = val;
    for(auto e: v[val]) {
        if(e.first == prev) continue;
        dist[e.first] = dist[val] + e.second;
        countDist(e.first, val, v1);
    }
}

pair < int, pii > getDiam(int root) {
    int v1 = root, v2 = root;

    dist[root] = 0;
    countDist(root, root, v1);

    dist[v1] = 0;
    countDist(v1, v1, v2);

    return {dist[v2], {v1, v2}};
}

bool dfs(int val, int prev, int v2, int& res) {
    used[val] = true;

    bool flag = (val == v2);
    for(auto e: v[val]) {
        if(e.first == prev) continue;
        if(dfs(e.first, val, v2, res)) flag = true;
    }

    if(flag) {
        res = min(res, max(dist[val], dist[v2] - dist[val]));
        return true;
    }
    return false;
}

int getHalfDiam(int root) {
    pii d = getDiam(root).second;

    int tmp = root;
    int res = 2e9;

    dist[d.first] = 0;
    countDist(d.first, d.first, tmp);
    dfs(d.first, d.first, d.second, res);

    return res;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    n = N; m = M, l = L;

    for(int i = 0; i < m; i++) {
        v[A[i]].push_back({ B[i], T[i] });
        v[B[i]].push_back({ A[i], T[i] });
    }

    if(m == n - 1) return getDiam(0).first;

    int res = -2e9;
    vector < int > x;

    for(int i = 0; i < n; i++) {
        if(!used[i]) {
            res = max(res, getDiam(i).first);
            x.push_back(getHalfDiam(i));
        }
    }
    sort(x.begin(), x.end());

    if(x.size() >= 3) {
        res = max(res, x[x.size() - 2] + x[x.size() - 3] + 2 * l);
    }
    if(x.size() >= 2) {
        res = max(res, x[x.size() - 1] + x[x.size() - 2] + l);
    }

    return res;
}
#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...