제출 #1353933

#제출 시각아이디문제언어결과실행 시간메모리
1353933waygonz꿈 (IOI13_dreaming)C++20
100 / 100
57 ms38384 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

const int n = 100000;

int par[n], dep[n], dia[n], ans[n];
vector<pair<int, int>> adj[n];

int fp(int x) {
    if (par[x] == -1) return x;
    return par[x] = fp(par[x]);
}

int dfs1(int x, int p) {
    int mx = 0;
    for (auto &[u, w] : adj[x]) {
        if (u == p) continue;
        mx = max(mx, w + dfs1(u, x));
    }
    return dep[x] = mx;
}

void dfs2(int x, int p, int v) {
    ans[x] = max(dep[x], v);
    if (adj[x].empty()) return;
    int k = adj[x].size();
    vector<int> tmp(k, 0), pfx(k, 0), sfx(k, 0);
    for (int i = 0; i < k; i++) {
        auto &[u, w] = adj[x][i];
        if (u == p) continue;
        tmp[i] = w + dep[u];
    }
    pfx[0] = tmp[0], sfx[k-1] = tmp[k-1];
    for (int i = 1; i < k; i++) pfx[i] = max(pfx[i-1], tmp[i]);
    for (int i = k-2; i >= 0; i--) sfx[i] = max(sfx[i+1], tmp[i]);
    for (int i = 0; i < k; i++) {
        auto &[u, w] = adj[x][i];
        if (u == p) continue;
        int mx = v;
        if (i > 0) mx = max(mx, pfx[i-1]);
        if (i < k-1) mx = max(mx, sfx[i+1]);
        dfs2(u, x, mx + w);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    memset(par, -1, sizeof(par));
    vector<bool> rt(N, false);
    vector<int> mn(N, INT_MAX), l;
    for (int i = 0; i < M; i++) {
        adj[A[i]].emplace_back(B[i], T[i]);
        adj[B[i]].emplace_back(A[i], T[i]);
        int pa = fp(A[i]), pb = fp(B[i]);
        par[pa] = pb;
    }
    for (int i = 0; i < N; i++) rt[fp(i)] = true;
    for (int i = 0; i < N; i++) {
        if (!rt[i]) continue;
        dfs1(i, -1);
        dfs2(i, -1, 0);
    }
    int mx = 0;
    for (int i = 0; i < N; i++) mn[fp(i)] = min(mn[fp(i)], ans[i]), dia[fp(i)] = max(dia[fp(i)], ans[i]);
    for (int i = 0; i < N; i++) {
        if (!rt[i]) continue;
        mx = max(mx, dia[i]);
        l.emplace_back(mn[i]);
    }
    mx = max(mx, l[0]);
    sort(l.rbegin(), l.rend());
    if (l.size() >= 2) mx = max(mx, l[0] + l[1] + L);
    if (l.size() >= 3) mx = max(mx, l[1] + l[2] + 2 * L);
    return mx;
}
#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...