Submission #436661

#TimeUsernameProblemLanguageResultExecution timeMemory
436661erekleDreaming (IOI13_dreaming)C++17
100 / 100
152 ms17892 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<pair<int, int>>> g;
vector<bool> seen;

// +++ FINDS DIAMETER OF COMPONENT GIVEN ANY NODE +++
pair<int, int> findFurthest(int v, int parent = -1) { // returns distance, node
    seen[v] = true;
    pair<int, int> furthest{0, v};
    for (pair<int, int> u : g[v]) {
        if (u.first == parent) continue;
        pair<int, int> d = findFurthest(u.first, v);
        d.first += u.second;
        if (d > furthest) furthest = d;
    }
    return furthest;
}

int diameter(int v) {
    pair<int, int> furthest = findFurthest(v);
    return findFurthest(furthest.second).first;
}
// ------------------ END DIAMETER ------------------



vector<int> longest, longestID, secondLongest; // with first move down
int dfs1(int v, int parent = -1) {
    seen[v] = true;
    for (pair<int, int> u : g[v]) {
        if (u.first == parent) continue;
        int d = u.second + dfs1(u.first, v);
        if (d >= longest[v]) {
            secondLongest[v] = longest[v];
            longest[v] = d, longestID[v] = u.first;
        } else if (d > secondLongest[v]) secondLongest[v] = d;
    }
    return longest[v];
}

vector<int> longestFrom;
int dfs2(int v, int bestUp = 0, int parent = -1) {
    seen[v] = true;
    longestFrom[v] = max(longest[v], bestUp);
    int minLongest = longestFrom[v];
    for (pair<int, int> u : g[v]) {
        if (u.first == parent) continue;
        int child;
        if (u.first == longestID[v]) {
            child = dfs2(u.first, u.second + max(secondLongest[v], bestUp), v);
        } else {
            child = dfs2(u.first, u.second + max(longest[v], bestUp), v);
        }
        minLongest = min(minLongest, child);
    }
    return minLongest;
}

int travelTime(int n, int m, int L, int A[], int B[], int T[]) {
    g.resize(n);
    for (int i = 0; i < m; ++i) {
        g[A[i]].emplace_back(B[i], T[i]);
        g[B[i]].emplace_back(A[i], T[i]);
    }

    // find longest distance from each node
    longest.resize(n), longestID.resize(n, -1), secondLongest.resize(n);
    seen.resize(n);
    for (int i = 0; i < n; ++i) {
        if (!seen[i]) dfs1(i);
    }

    // finish finding longest distances
    // and find smallest longest distance in each component
    vector<int> vals; // gates
    longestFrom.resize(n);
    seen.assign(n, false);
    for (int i = 0; i < n; ++i) {
        if (!seen[i]) vals.push_back(dfs2(i));
    }

    sort(vals.rbegin(), vals.rend());

    int maxD = 0;
    seen.assign(n, false);
    for (int i = 0; i < n; ++i) {
        if (!seen[i]) maxD = max(maxD, diameter(i));
    }
    if (vals.size() >= 2) maxD = max(maxD, vals[0] + L + vals[1]);
    if (vals.size() >= 3) maxD = max(maxD, vals[1] + 2*L + vals[2]);
    return maxD;
}
#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...