답안 #159721

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
159721 2019-10-24T07:43:25 Z rama_pang 꿈 (IOI13_dreaming) C++14
14 / 100
81 ms 16248 KB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

/*  Find the diameters (d) of all connected components. Let's denote the distance
    from optimal connection point such thay distance from this node to all
    other nodes are minimized as the radius. The radius then must lie on the
    diameter.

    Sort all connected components in descending order, r1 >= r2 >= r3 >=...
    There are two cases:
    - If r1 + r2 + L <= d1
      Then if we connect all components on r1, then the diameter won't ever change.
      In this case, the answer is d1.
    - If r1 + r2 + L > d1
      Let's join these two trees, and find it's radius. It's obvious that the radius
      lies on the path r1-L-r2, with radius rn. We must minimize rn, and since r1 >= r2,
      then the optimal rn is in tree1, since if it is at tree2, them L + r1 > r2, is an
      order of magnitude greater than minimal possible, that is, r1 < L + r2.

      Thus the optimal rn is on the path of r1. However, since r1 + r2 + L > d1 and d1 <= 2 * r1,
      r2 + L > r1. Thus we must minimize the distance to r2, that is, at the position of r1.
      We can just connect all components to the node containing r1. The answer is then the
      maximum of r1 + r2 + L and r2 + r3 + 2 * L, all other radius will yield less.

*/

int dfs(int n, int now, int p, vector<int> &dist, const vector<vector<pair<int, int>>> &G) {
    dist[n] = now;
    int id = n, mx = 0;
    for (auto i : G[n]) if (i.second != p) {
        int k = dfs(i.second, now + i.first, n, dist, G);
        if (dist[k] > mx) {
            mx = dist[k];
            id = k;
        }
    }

    return id;
}

bool get_diameter(int n, int t, int p, vector<int> &d, const vector<vector<pair<int, int>>> &G) {
    if (n == t) {
        d.push_back(t);
        return true;
    }

    for (auto i : G[n]) if (i.second != p) {
        if (get_diameter(i.second, t, n, d, G)) {
            d.push_back(n);
            return true;
        }
    }
    
    return false;
}

void dfs_clear(int n, vector<int> &vis, vector<int> &dist, const vector<vector<pair<int, int>>> &G) {
    if (vis[n] == 1) return;
    dist[n] = 0;
    vis[n] = 1;
    for (auto i : G[n]) dfs_clear(i.second, vis, dist, G);
}

int get_radius(int n, int &max_d, const vector<vector<pair<int, int>>> &G, vector<int> &vis, vector<int> &dist) {
    if (vis[n]) return -1;
    int N = G.size();

    /* two dfs to determine diameter of current connected tree */
    int u = dfs(n, 0, -1, dist, G);
    int v = dfs(u, 0, -1, dist, G);

    vector<int> diameter;
    get_diameter(u, v, -1, diameter, G);
    reverse(diameter.begin(), diameter.end());
    /* u is first element in diameter, v is furthest element */

    int minim = INT_MAX;
    for (auto i : diameter) minim = min(minim, max(dist[i], dist[v] - dist[i]));
    max_d = max(max_d, dist[v]);
    dfs_clear(n, vis, dist, G);

    return minim;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    vector<vector<pair<int, int>>> G(N);
    vector<int> visited(N), dist(N);
    for (int i = 0; i < M; i++) {
        G[A[i]].emplace_back(T[i], B[i]);
        G[B[i]].emplace_back(T[i], A[i]);
    }
    
    priority_queue<int, vector<int>, greater<int>> max_radius;
    int max_d = 0;
    for (int i = 0; i < M; i++) {
        int radius = get_radius(i, max_d, G, visited, dist);
        if (radius != -1) max_radius.push(radius);
        while (max_radius.size() > 3) max_radius.pop();
    }

    vector<int> rad;
    while (!max_radius.empty()) {
        rad.push_back(max_radius.top());
        max_radius.pop();
    }

    sort(rad.begin(), rad.end(), greater<int>());
    int res = max({max_d, rad[0] + rad[1] + L, ((rad.size() > 2)? (rad[1] + rad[2] + L + L) : 0)});

    return res;
}

Compilation message

dreaming.cpp: In function 'int get_radius(int, int&, const std::vector<std::vector<std::pair<int, int> > >&, std::vector<int>&, std::vector<int>&)':
dreaming.cpp:67:9: warning: unused variable 'N' [-Wunused-variable]
     int N = G.size();
         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 16248 KB Output is correct
2 Correct 81 ms 16120 KB Output is correct
3 Correct 51 ms 10744 KB Output is correct
4 Correct 12 ms 2680 KB Output is correct
5 Correct 11 ms 1656 KB Output is correct
6 Correct 20 ms 3820 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 37 ms 6056 KB Output is correct
9 Correct 48 ms 8352 KB Output is correct
10 Correct 2 ms 504 KB Output is correct
11 Correct 70 ms 10872 KB Output is correct
12 Correct 77 ms 13428 KB Output is correct
13 Correct 2 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 16248 KB Output is correct
2 Correct 81 ms 16120 KB Output is correct
3 Correct 51 ms 10744 KB Output is correct
4 Correct 12 ms 2680 KB Output is correct
5 Correct 11 ms 1656 KB Output is correct
6 Correct 20 ms 3820 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 37 ms 6056 KB Output is correct
9 Correct 48 ms 8352 KB Output is correct
10 Correct 2 ms 504 KB Output is correct
11 Correct 70 ms 10872 KB Output is correct
12 Correct 77 ms 13428 KB Output is correct
13 Correct 2 ms 504 KB Output is correct
14 Correct 2 ms 376 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 2 ms 376 KB Output is correct
18 Correct 2 ms 376 KB Output is correct
19 Correct 2 ms 376 KB Output is correct
20 Correct 2 ms 376 KB Output is correct
21 Correct 2 ms 376 KB Output is correct
22 Correct 2 ms 380 KB Output is correct
23 Correct 2 ms 376 KB Output is correct
24 Correct 2 ms 376 KB Output is correct
25 Correct 2 ms 376 KB Output is correct
26 Correct 2 ms 376 KB Output is correct
27 Correct 2 ms 380 KB Output is correct
28 Runtime error 2 ms 376 KB Execution killed with signal 11 (could be triggered by violating memory limits)
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 16248 KB Output is correct
2 Correct 81 ms 16120 KB Output is correct
3 Correct 51 ms 10744 KB Output is correct
4 Correct 12 ms 2680 KB Output is correct
5 Correct 11 ms 1656 KB Output is correct
6 Correct 20 ms 3820 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 37 ms 6056 KB Output is correct
9 Correct 48 ms 8352 KB Output is correct
10 Correct 2 ms 504 KB Output is correct
11 Correct 70 ms 10872 KB Output is correct
12 Correct 77 ms 13428 KB Output is correct
13 Correct 2 ms 504 KB Output is correct
14 Correct 2 ms 376 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 2 ms 376 KB Output is correct
18 Correct 2 ms 376 KB Output is correct
19 Correct 2 ms 376 KB Output is correct
20 Correct 2 ms 376 KB Output is correct
21 Correct 2 ms 376 KB Output is correct
22 Correct 2 ms 380 KB Output is correct
23 Correct 2 ms 376 KB Output is correct
24 Correct 2 ms 376 KB Output is correct
25 Correct 2 ms 376 KB Output is correct
26 Correct 2 ms 376 KB Output is correct
27 Correct 2 ms 380 KB Output is correct
28 Runtime error 2 ms 376 KB Execution killed with signal 11 (could be triggered by violating memory limits)
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 6008 KB Output is correct
2 Incorrect 30 ms 5984 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 16248 KB Output is correct
2 Correct 81 ms 16120 KB Output is correct
3 Correct 51 ms 10744 KB Output is correct
4 Correct 12 ms 2680 KB Output is correct
5 Correct 11 ms 1656 KB Output is correct
6 Correct 20 ms 3820 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 37 ms 6056 KB Output is correct
9 Correct 48 ms 8352 KB Output is correct
10 Correct 2 ms 504 KB Output is correct
11 Correct 70 ms 10872 KB Output is correct
12 Correct 77 ms 13428 KB Output is correct
13 Correct 2 ms 504 KB Output is correct
14 Correct 3 ms 504 KB Output is correct
15 Correct 3 ms 504 KB Output is correct
16 Correct 4 ms 564 KB Output is correct
17 Correct 3 ms 376 KB Output is correct
18 Correct 3 ms 504 KB Output is correct
19 Correct 4 ms 504 KB Output is correct
20 Correct 2 ms 376 KB Output is correct
21 Correct 3 ms 508 KB Output is correct
22 Correct 4 ms 632 KB Output is correct
23 Correct 2 ms 376 KB Output is correct
24 Correct 2 ms 376 KB Output is correct
25 Correct 2 ms 376 KB Output is correct
26 Correct 2 ms 376 KB Output is correct
27 Correct 2 ms 376 KB Output is correct
28 Incorrect 2 ms 376 KB Output isn't correct
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 16248 KB Output is correct
2 Correct 81 ms 16120 KB Output is correct
3 Correct 51 ms 10744 KB Output is correct
4 Correct 12 ms 2680 KB Output is correct
5 Correct 11 ms 1656 KB Output is correct
6 Correct 20 ms 3820 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 37 ms 6056 KB Output is correct
9 Correct 48 ms 8352 KB Output is correct
10 Correct 2 ms 504 KB Output is correct
11 Correct 70 ms 10872 KB Output is correct
12 Correct 77 ms 13428 KB Output is correct
13 Correct 2 ms 504 KB Output is correct
14 Correct 2 ms 376 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 2 ms 376 KB Output is correct
18 Correct 2 ms 376 KB Output is correct
19 Correct 2 ms 376 KB Output is correct
20 Correct 2 ms 376 KB Output is correct
21 Correct 2 ms 376 KB Output is correct
22 Correct 2 ms 380 KB Output is correct
23 Correct 2 ms 376 KB Output is correct
24 Correct 2 ms 376 KB Output is correct
25 Correct 2 ms 376 KB Output is correct
26 Correct 2 ms 376 KB Output is correct
27 Correct 2 ms 380 KB Output is correct
28 Runtime error 2 ms 376 KB Execution killed with signal 11 (could be triggered by violating memory limits)
29 Halted 0 ms 0 KB -