제출 #1343268

#제출 시각아이디문제언어결과실행 시간메모리
1343268MunkhErdene공장들 (JOI14_factories)C++17
컴파일 에러
0 ms0 KiB
#include "factories.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define _ << " " <<
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define ull unsigned long long
#define lll __int128
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define BlueCrowner ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)

const int MAXN = 5e5 + 5;
const ll inf = 1e18;

vector<pair<int, int>> g[MAXN];
int dead[MAXN], sz[MAXN];
bool is_a[MAXN], is_b[MAXN];
int n;
ll mn_dist;

int dfs_size(int u, int p) {
    sz[u] = 1;
    for(auto &[v, w] : g[u]) {
        if(v == p || dead[v]) continue;
        sz[u] += dfs_size(v, u);
    }
    return sz[u];
}

int dfs_centroid(int u, int p, int total_sz) {
    for(auto &[v, w] : g[u]) {
        if(v == p || dead[v]) continue;
        if(sz[v] > total_sz / 2) return dfs_centroid(v, u, total_sz);
    }
    return u;
}

ll mn_a, mn_b;

void dfs_dist(int u, int p, ll d) {
    if(is_a[u]) mn_a = min(mn_a, d);
    if(is_b[u]) mn_b = min(mn_b, d);
    for(auto &[v, w] : g[u]) {
        if(v == p || dead[v]) continue;
        dfs_dist(v, u, d + w);
    }
}

void decompose(int u) {
    int total_sz = dfs_size(u, 0);
    int c = dfs_centroid(u, 0, total_sz);
    dead[c] = 1;

    ll best_a = (is_a[c] ? 0 : inf);
    ll best_b = (is_b[c] ? 0 : inf);

    mn_dist = min(mn_dist, best_a + best_b);

    for(auto &[v, w] : g[c]) {
        if(dead[v]) continue;

        mn_a = inf;
        mn_b = inf;
        dfs_dist(v, c, (ll)w);

        mn_dist = min(mn_dist, mn_a + best_b);
        mn_dist = min(mn_dist, mn_b + best_a);

        best_a = min(best_a, mn_a);
        best_b = min(best_b, mn_b);
    }

    for(auto &[v, w] : g[c]) {
        if(dead[v]) continue;
        decompose(v);
    }
}

void Init(int N, vector<int> A, vector<int> B, vector<int> D) {
    n = N;
    FOR(i, 1, n + 1) {
        g[i].clear();
        dead[i] = 0;
        is_a[i] = false;
        is_b[i] = false;
    }

    FOR(i, 0, n - 1) {
        int u = A[i] + 1, v = B[i] + 1, w = D[i];
        g[u].pb({v, w});
        g[v].pb({u, w});
    }
}

ll Query(int S, vector<int> A, int T, vector<int> B) {
    fill(is_a, is_a + n + 1, 0);
    fill(is_b, is_b + n + 1, 0);
    fill(dead, dead + n + 1, 0);

    FOR(i, 0, S) is_a[A[i] + 1] = 1;
    FOR(i, 0, T) is_b[B[i] + 1] = 1;

    mn_dist = inf;
    decompose(1);

    return mn_dist;
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccopUFGg.o: in function `main':
grader.cpp:(.text.startup+0x3b0): undefined reference to `Init(int, int*, int*, int*)'
/usr/bin/ld: grader.cpp:(.text.startup+0x43b): undefined reference to `Query(int, int*, int, int*)'
collect2: error: ld returned 1 exit status