제출 #1263414

#제출 시각아이디문제언어결과실행 시간메모리
1263414tkhoi13Dreaming (IOI13_dreaming)C++20
0 / 100
19 ms6976 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
#define REP(i, n) for (int i = 0, _b = (n); i < _b; i++)
#define FOR(i, a, b) for (int i = a, _b = (b); i = _b; i++)
#define pb push_back
#define szx(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()

using namespace std;

#define pii pair<int, int>

vector<pii> adj[100000];
vector<int> dis(100000, -1);

int ans = 0;
int mx = 0, d = 0;
int par[100000];

void dfs(int u, int p = -1) {
    if (mx < dis[u]) mx = dis[u], d = u;
    par[u] = p;

    for (auto& [v, w] : adj[u]) {
        if (v != p) {
            dis[v] = dis[u] + w;
            dfs(v, u);
        }
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    REP(i, N) {
        adj[A[i]].pb({B[i], T[i]});
        adj[B[i]].pb({A[i], T[i]});
    }

    vector<int> half;

    REP(i, N) if (!dis[i]) {
        int mx = 0;

        dfs(i);
        int d1 = d;
        mx = 0, d = -1;
        dis[d1] = 0;
        dfs(d1);
        int d2 = d;
        ans = max(ans, mx);
        int ans1 = INT_MAX;

        for (int u = d2; u != -1; u = par[u]) ans1 = min(max(dis[u], ans - dis[u]), ans1);
        half.pb(ans1);
    }

    sort(all(half), greater<int>());

    FOR(i, 1, szx(half) - 1) { ans = max(ans, half[0] * i * half[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...