답안 #843597

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
843597 2023-09-04T08:13:39 Z anha3k25cvp 꿈 (IOI13_dreaming) C++14
18 / 100
45 ms 22868 KB
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define dl double
#define st first
#define nd second
#define II pair <int, int>
#include "dreaming.h"

using namespace std;

const int inf = 7 + 1e9;

vector <int> vis, f, g;
vector <vector <II>> adj;

void dfs(int u) {
    vis[u] = 1;
    for (auto z : adj[u]) {
        int v = z.st, w = z.nd;
        if (vis[v])
            continue;
        dfs(v);
        f[u] = max(f[u], f[v] + w);
    }
}

int dfs_(int u, int p) {
    int ans = max(f[u], g[u]);
    vector <II> V;
    for (auto z : adj[u])
        if (z.st != p)
            V.push_back(z);
    vector <int> l(V.size(), 0), r(V.size(), 0);
    for (int i = 1; i < V.size(); i ++)
        l[i] = max(l[i - 1], f[V[i - 1].st] + V[i - 1].nd);
    for (int i = (int)V.size() - 2; i >= 0; i --)
        r[i] = max(r[i + 1], f[V[i + 1].st] + V[i + 1].nd);
    for (int i = 0; i < V.size(); i ++) {
        int v = V[i].st, w = V[i].nd;
        g[v] = max({l[i], r[i], g[u]}) + w;
        ans = min(ans, dfs_(v, u));
    }
    return ans;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    adj.resize(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]});
    }
    vis.assign(N, 0);
    f.assign(N, 0);
    g.assign(N, 0);
    vector <int> c;
    for (int i = 0; i < N; i ++)
        if (!vis[i]) {
            dfs(i);
            int val = dfs_(i, 0);
            c.push_back(val);
        }
    if (c.size() == 1)
        return c[0];
    if (c.size() == 2)
        return c[0] + c[1] + L;
    vector <vector <int>> l(c.size(), vector <int> (2, 0)), r(c.size(), vector <int> (2, 0));
    for (int i = 1; i < c.size(); i ++) {
        l[i][0] = l[i - 1][0];
        l[i][1] = l[i - 1][1];
        if (c[i - 1] > l[i][0]) {
            l[i][1] = l[i][0];
            l[i][0] = c[i - 1];
        }
        else if (c[i - 1] > l[i][1])
            l[i][1] = c[i - 1];
    }
    for (int i = (int)c.size() - 2; i >= 0; i --) {
        r[i][0] = r[i + 1][0];
        r[i][1] = r[i + 1][1];
        if (c[i + 1] > r[i][0]) {
            r[i][1] = r[i][0];
            r[i][0] = c[i + 1];
        }
        else if (c[i + 1] > r[i][1])
            r[i][1] = c[i + 1];
    }
    int ans = inf;
    for (int i = 0; i < c.size(); i ++) {
        int ma1 = l[i][0], ma2 = l[i][1];
        for (int j = 0; j < 2; j ++)
            if (r[i][j] > ma1) {
                ma2 = ma1;
                ma1 = r[i][j];
            }
            else if (r[i][j] > ma2)
                ma2 = r[i][j];
        ans = min(ans, max(ma1 + c[i] + L, ma1 + ma2 + 2 * L));
    }
    return ans;
}

Compilation message

dreaming.cpp: In function 'int dfs_(int, int)':
dreaming.cpp:35:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     for (int i = 1; i < V.size(); i ++)
      |                     ~~^~~~~~~~~~
dreaming.cpp:39:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     for (int i = 0; i < V.size(); i ++) {
      |                     ~~^~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:68:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for (int i = 1; i < c.size(); i ++) {
      |                     ~~^~~~~~~~~~
dreaming.cpp:89:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     for (int i = 0; i < c.size(); i ++) {
      |                     ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 45 ms 22868 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 45 ms 22868 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 13532 KB Output is correct
2 Correct 25 ms 13532 KB Output is correct
3 Correct 22 ms 13568 KB Output is correct
4 Correct 21 ms 13504 KB Output is correct
5 Correct 21 ms 13332 KB Output is correct
6 Correct 22 ms 14376 KB Output is correct
7 Correct 23 ms 14048 KB Output is correct
8 Correct 21 ms 13280 KB Output is correct
9 Correct 20 ms 13272 KB Output is correct
10 Correct 23 ms 14032 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 16 ms 15304 KB Output is correct
13 Correct 15 ms 15168 KB Output is correct
14 Correct 13 ms 15312 KB Output is correct
15 Correct 14 ms 15316 KB Output is correct
16 Correct 13 ms 15312 KB Output is correct
17 Correct 13 ms 15568 KB Output is correct
18 Correct 13 ms 15324 KB Output is correct
19 Correct 13 ms 15144 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 0 ms 348 KB Output is correct
22 Correct 1 ms 860 KB Output is correct
23 Correct 15 ms 15316 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 45 ms 22868 KB Output isn't correct
2 Halted 0 ms 0 KB -