Submission #93710

#TimeUsernameProblemLanguageResultExecution timeMemory
93710aaaFactories (JOI14_factories)C++14
100 / 100
4614 ms180308 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

char lvl[500001];
int par[500001], sz[500001];
ll dist[500001][20], ans[500001];
bool done[500001];
vector<pii> adj[500001];

void dfs(int u, int p, int curlvl, ll d) {
    sz[u] = 1;
    dist[u][curlvl] = d;
    for (pii v : adj[u]) {
        if (v.first != p && !done[v.first]) {
            dfs(v.first, u, curlvl, d + v.second);
            sz[u] += sz[v.first];
        }
    }
}

int centre(int u, int p, int tot) {
    for (pii v : adj[u]) {
        if (v.first != p && !done[v.first] && sz[v.first]<<1 > tot) {
            return centre(v.first, u, tot);
        }
    }

    return u;
}

void decomp(int i, int p, int curlvl, int tot) {
    dfs(i, -1, curlvl, 0);
    int c = centre(i, -1, tot);
    dfs(c, -1, curlvl, 0);
    done[c] = true;
    lvl[c] = curlvl;
    par[c] = p;

    for (pii v : adj[c]) {
        if (v.first != p && !done[v.first]) {
             decomp(v.first, c, curlvl+1, sz[v.first]);
        }
    }
}

void Init(int N, int A[], int B[], int D[]) {
    for (int i = 0; i < N-1; i++) {
        adj[A[i]].push_back({B[i], D[i]});
        adj[B[i]].push_back({A[i], D[i]});
    }

    for (int i = 0; i < 500000; i++)
        ans[i] = 0x3f3f3f3f3f3f3f3f;
    decomp(0, -1, 0, N);
}

long long Query(int S, int X[], int T, int Y[]) {
    ll mn = 0x3f3f3f3f3f3f3f3f;
    for (int i = 0; i < S; i++) {
        int cur = X[i];
        while(cur != -1) {
            ans[cur] = min(ans[cur], dist[X[i]][lvl[cur]]);
            cur = par[cur];
        }
    }

    for (int i = 0; i < T; i++) {
        int cur = Y[i];
        while(cur != -1) {
            mn = min(mn, dist[Y[i]][lvl[cur]] + ans[cur]);
            cur = par[cur];
        }
    }

    for (int i = 0; i < S; i++) {
        int cur = X[i];
        while(cur != -1) {
            ans[cur] = 0x3f3f3f3f3f3f3f3f;
            cur = par[cur];
        }
    }

    return mn;
}

Compilation message (stderr)

factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:65:57: warning: array subscript has type 'char' [-Wchar-subscripts]
             ans[cur] = min(ans[cur], dist[X[i]][lvl[cur]]);
                                                         ^
factories.cpp:73:45: warning: array subscript has type 'char' [-Wchar-subscripts]
             mn = min(mn, dist[Y[i]][lvl[cur]] + ans[cur]);
                                             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...