Submission #1231436

#TimeUsernameProblemLanguageResultExecution timeMemory
1231436rhm_ganDreaming (IOI13_dreaming)C++20
47 / 100
1096 ms37428 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;

const int N = 200001;

struct Graph {
    vector<vector<pair<int, int>>> g;
    vector<int> max_dist[2];
    int x, cnt;

    Graph() {
        g.resize(N);
        max_dist[0].resize(N);
        max_dist[1].resize(N);
        x = cnt = 0;
    }

    void add(int a, int b, int w) {
        x = a;
        g[a].push_back({b, w});
        g[b].push_back({a, w});
        cnt++;
    }

    void update(int node, int offer) {
        if (offer > max_dist[0][node]) {
            max_dist[1][node] = max_dist[0][node];
            max_dist[0][node] = offer;
        } else if (offer > max_dist[1][node]) {
            max_dist[1][node] = offer;
        }
    }

    void dfs1(int node, int parent) {
        for (auto [child, w] : g[node]) {
            if (child == parent) continue;
            dfs1(child, node);
            update(node, max_dist[0][child] + w);
        }
    }

    void dfs2(int node, int parent) {
        for (auto [child, w] : g[node]) {
            if (child == parent) continue;
            if (max_dist[0][node] == max_dist[0][child] + w) {
                update(child, max_dist[1][node] + w);
            } else {
                update(child, max_dist[0][node] + w);
            }
            dfs2(child, node);
        }
    }

    int findmin() {
        dfs1(x, -1);
        dfs2(x, -1);
        int mn = 1e9, id = -1;
        for (int i = 0; i < N; i++) {
            int val = max_dist[0][i];
            if (val != 0 && val < mn) {
                mn = val;
                id = i;
            }
        }
        return id;
    }

    void clear() {
        g.assign(N, vector<pair<int, int>>());
        max_dist[0].assign(N, 0);
        max_dist[1].assign(N, 0);
        x = cnt = 0;
    }
};

vector<pair<int, int>> adj[N];
Graph tmp;
bool vis[N];

void dfs(int u) {
    vis[u] = 1;
    for (auto [v, w] : adj[u]) {
        if (!vis[v]) {
            tmp.add(u, v, w);
            dfs(v);
        }
    }
}

int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    Graph res;
    vector<bool> is(n);

    for (int i = 0; i < m; i++) {
        int u = a[i], v = b[i], w = t[i];
        is[u] = is[v] = 1;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
        res.add(u, v, w);
    }

    vector<int> v;
    for (int i = 0; i < n; i++) {
        if (!is[i]) v.push_back(i);
    }

    for (int i = 0; i < n; i++) {
        if (!vis[i] && is[i]) {
            tmp.clear();
            dfs(i);
            v.push_back(tmp.findmin());
        }
    }

    for (int i = 1; i < v.size(); i++) {
        res.add(v[i], v[i - 1], l);
    }

    int id = res.findmin();
    int ans = 0;
    for (int i = 0; i < N; i++) {
        ans = max(ans, res.max_dist[0][i]);
    }

    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...