답안 #780178

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
780178 2023-07-12T07:08:27 Z adaawf 공장들 (JOI14_factories) C++17
15 / 100
8000 ms 262928 KB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
long long int f[500005];
int n, d[500005], tin[500005], b[2000005], l[2000005], z = 0;
vector<int> gg[500005], g[500005];
int p[500005][20], pp[2000005][22];
void bfs(int x) {
    queue<int> q;
    q.push(x);
    p[x][0] = x;
    f[x] = d[x] = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int j = 1; j <= 19; j++) {
             p[u][j] = p[p[u][j - 1]][j - 1];
             if (p[u][j] == 0) break;
        }
        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i];
            if (d[u] + 1 < d[v]) {
                d[v] = d[u] + 1;
                f[v] = f[u] + gg[u][i];
                p[v][0] = u;
                q.push(v);
            }
        }
    }
}
void dfs(int x, int p) {
    b[++z] = x;
    pp[z][0] = x;
    tin[x] = z;
    for (int w : g[x]) {
        if (w == p) continue;
        dfs(w, x);
        b[++z] = x;
        pp[z][0] = x;
    }
    b[++z] = x;
    pp[z][0] = x;
}
void Init(int N, int A[], int B[], int D[]) {
    n = N;
    for (int i = 0; i < 500000; i++) {
        f[i] = 999999999999999999;
        d[i] = n * 2;
    }
    for (int i = 0; i < n - 1; i++) {
        int u = A[i], v = B[i], w = D[i];
        g[u].push_back(v);
        g[v].push_back(u);
        gg[u].push_back(w);
        gg[v].push_back(w);
    }
    bfs(0);
    dfs(0, -1);
    for (int i = 2; i <= 2000000; i++) l[i] = l[i / 2] + 1;
    for (int i = 1; (1 << i) <= z; i++) {
        for (int j = 1; j <= z - (1 << i) + 1; j++) {
            if (d[pp[j][i - 1]] < d[pp[j + (1 << (i - 1))][i - 1]]) pp[j][i] = pp[j][i - 1];
            else pp[j][i] = pp[j + (1 << (i - 1))][i - 1];
        }
    }
}
int lca(int u, int v) {
    int x = tin[u], y = tin[v];
    if (y <= x) swap(x, y);
    int g = l[y - x + 1];
    int h = pp[x][g], k = pp[y - (1 << g) + 1][g];
    if (d[h] < d[k]) return h;
    return k;
}
long long int check(int u, int v) {
    return f[u] + f[v] - f[lca(u, v)] * 2;
}
long long int Query(int S, int X[], int T, int Y[]) {
        vector<long long int> ff(n, 999999999999999999);
        vector<bool> dda(n, 0), dd(n, 0);
        for (int i = 0; i < T; i++) {
            dda[Y[i]] = 1;
        }
        priority_queue<pair<long long int, long long int>> q;
        for (int i = 0; i < S; i++) {
            q.push({0, X[i]});
            ff[X[i]] = 0;
        }
        while (!q.empty()) {
            int u = q.top().second;
            q.pop();
            if (dd[u] == 1) continue;
            dd[u] = 1;
            if (dda[u] == 1) return ff[u];
            for (int i = 0; i < g[u].size(); i++) {
                int v = g[u][i], w = gg[u][i];
                if (ff[u] + w < ff[v]) {
                    ff[v] = ff[u] + w;
                    q.push({-ff[v], v});
                }
            }
        }
}

Compilation message

factories.cpp: In function 'void bfs(int)':
factories.cpp:20:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |         for (int i = 0; i < g[u].size(); i++) {
      |                         ~~^~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:95:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |             for (int i = 0; i < g[u].size(); i++) {
      |                             ~~^~~~~~~~~~~~~
factories.cpp:79:55: warning: control reaches end of non-void function [-Wreturn-type]
   79 |         vector<long long int> ff(n, 999999999999999999);
      |                                                       ^
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 37972 KB Output is correct
2 Correct 1010 ms 47720 KB Output is correct
3 Correct 341 ms 47824 KB Output is correct
4 Correct 430 ms 47856 KB Output is correct
5 Correct 544 ms 47984 KB Output is correct
6 Correct 1549 ms 48548 KB Output is correct
7 Correct 303 ms 47784 KB Output is correct
8 Correct 1062 ms 47844 KB Output is correct
9 Correct 577 ms 47972 KB Output is correct
10 Correct 1515 ms 48520 KB Output is correct
11 Correct 308 ms 47612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 37836 KB Output is correct
2 Execution timed out 8080 ms 262928 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 37972 KB Output is correct
2 Correct 1010 ms 47720 KB Output is correct
3 Correct 341 ms 47824 KB Output is correct
4 Correct 430 ms 47856 KB Output is correct
5 Correct 544 ms 47984 KB Output is correct
6 Correct 1549 ms 48548 KB Output is correct
7 Correct 303 ms 47784 KB Output is correct
8 Correct 1062 ms 47844 KB Output is correct
9 Correct 577 ms 47972 KB Output is correct
10 Correct 1515 ms 48520 KB Output is correct
11 Correct 308 ms 47612 KB Output is correct
12 Correct 25 ms 37836 KB Output is correct
13 Execution timed out 8080 ms 262928 KB Time limit exceeded
14 Halted 0 ms 0 KB -