제출 #1126081

#제출 시각아이디문제언어결과실행 시간메모리
1126081m_bezrutchka꿈 (IOI13_dreaming)C++20
47 / 100
61 ms15304 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

const int MAXN = 1e5 + 10;
vector<pii> adj[MAXN];
int n, distante;
int dist[MAXN];
pii pai[MAXN];
vector<vector<pii>> chains;
bool mrk_1[MAXN], mrk_2[MAXN];
vector<int> st;
int diam;

void dfs(int v) {
    // cout << "dfs " << v << endl;
    mrk_2[v] = true;
    mrk_1[v] = true;
    if (dist[distante] < dist[v]) {
        distante = v;
    }
    for (auto [w, nc]: adj[v]) {
        if (pai[v].first == w) continue;
        pai[w] = {v, nc};
        dist[w] = dist[v] + nc;
        dfs(w);
    }
}

int compute_radius() {
    int v = distante;
    vector<int> all_c;
    int tot = 0;
    while (v != -1) {
        // cout << "processed node " << v << endl;
        tot += pai[v].second;
        all_c.push_back(pai[v].second);
        v = pai[v].first;
    }
    int l = 0, r = tot;
    int resp = tot;
    for (int x: all_c) {
        // cout << "looking at x " << x << endl;
        l += x;
        r -= x;
        // cout << "l = " << l << " " << "r = " << r << endl;
        resp = min(resp, max(l, r));
    }
    // cout << "resp is " << resp << endl;
    return resp;
}

int find_radius(int v) {
    // cout << "find_radius " << v << endl;
    for (int i = 0; i < n; i++) {
        mrk_1[i] = false;
        dist[i] = 0;
        pai[i] = {-1, 0};
    }
    distante = v;
    dfs(v);
    // cout << "distante do v == " << distante << endl;
    for (int i = 0; i < n; i++) {
        mrk_1[i] = false;
        dist[i] = 0;
        pai[i] = {-1, 0};
    }
    dfs(distante);
    diam = max(diam, dist[distante]);
    // cout << "distante do distante == " << distante << endl;
    return compute_radius();
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    // subtask 3
    assert(M == N - 2);
    n = N;
    for (int i = 0; i < M; i++) {
        adj[A[i]].push_back({B[i], T[i]});
        adj[B[i]].push_back({A[i], T[i]});
    }
    int r1 = find_radius(0);
    int root = 0;
    while (mrk_2[root]) root++;
    int r2 = find_radius(root);
    return max(diam, r1 + r2 + L);
}

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