Submission #26440

# Submission time Handle Problem Language Result Execution time Memory
26440 2017-06-30T09:30:14 Z chpipis Factories (JOI14_factories) C++11
15 / 100
6000 ms 200148 KB
#include "factories.h"
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define fi first
#define se second

typedef long long ll;

const int MAXN = 5e5 + 5;
const int LOGN = 20;

const ll INF = 1e17;

vector<int> tree[MAXN];
vector<pair<int, int> > gr[MAXN];
//int par[MAXN][LOGN], lvl[MAXN];
//ll dist[MAXN];


int lvl[MAXN];
ll dist[MAXN][LOGN];
//unordered_map<int, ll> dist[MAXN];
bool mark[MAXN];
int sz[MAXN], cpar[MAXN], root;
ll ans[MAXN];

/*
void init(int u) {
    for (int j = 1; j < LOGN; j++)
        if (par[u][j - 1] != -1)
            par[u][j] = par[par[u][j - 1]][j - 1];
    for (auto v : gr[u])
        if (v.fi != par[u][0]) {
            dist[v.fi] = dist[u] + v.se;
            par[v.fi][0] = u;
            lvl[v.fi] = lvl[u] + 1;
            init(v.fi);
        }
}
*/
void dfs(int u, int p, const int who) {
    sz[u] = 1;
    for (auto v : gr[u])
        if (v.fi != p && !mark[v.fi]) {
            //dist[v.fi][who] = dist[u][who] + v.se;
            dfs(v.fi, u, who);
            sz[u] += sz[v.fi];
        }
}

void proc(int u, const int who, int p) {
    ll w = dist[u][lvl[u]];
    for (auto v : gr[u])
        if (v.fi != p && lvl[v.fi] != -1) {
            dist[v.fi][lvl[v.fi]] = w + v.se;
            proc(v.fi, who, u);
        }
}

void init(int u, bool del) {
    if (del) lvl[u] = -1;
    for (auto v : tree[u]) {
        if (!del) lvl[v] = lvl[u] + 1;
        init(v, del);
    }
}

int decompose(int u, int p, const int n) {
    int mx = -1, big = -1;
    for (auto v : gr[u])
        if (v.fi != p && !mark[v.fi] && sz[v.fi] > mx)
            mx = sz[v.fi], big = v.fi;
    //printf("i am at %d and big child is %d\n", u, big);
    if (2 * mx <= n) {
        mark[u] = true;
        //printf("START OF VISIT OF %d\n", u);
        for (auto v : gr[u])
            if (!mark[v.fi]) {
                //dist[v.fi][u] = v.se;
                dfs(v.fi, u, u);

                int cent = decompose(v.fi, u, sz[v.fi]);
                cpar[cent] = u;
                tree[u].pb(cent);

                lvl[u] = 0;
                lvl[cent] = 1;
                init(cent, false);

                dist[v.fi][lvl[v.fi]] = v.se;
                proc(v.fi, u, u);

                lvl[u] = -1;
                init(cent, true);
            }
        //printf("END OF VISIT OF %d\n", u);
        return u;
    } else {
        return decompose(big, u, n);
    }
}

void Init(int N, int A[], int B[], int D[]) {
    for (int i = 0; i < N - 1; i++) {
        gr[A[i]].pb(mp(B[i], D[i]));
        gr[B[i]].pb(mp(A[i], D[i]));
    }
    /*for (int i = 0; i < N; i++) {
        dist[i].reserve(LOGN);
        dist[i][i] = 0;
    }*/
    //memset(par, -1, sizeof par);
    //init(0);
    memset(cpar, -1, sizeof cpar);
    dfs(0, -1, -1);
    memset(lvl, -1, sizeof lvl);
    root = decompose(0, -1, sz[0]);
    fill(ans, ans + N + 1, INF);
    /*init(root);
    for (int i = 0; i < N; i++)
        proc(i, i, cpar[i]);*/
    /*printf("centroid is %d\n", root);
    for (int u = 0; u < N; u++)
        printf("cpar[%d] = %d\n", u, cpar[u]);*/
}
/*
unordered_map<int, int> memo[MAXN];

int LCA(int u, int v) {
    if (lvl[u] > lvl[v]) swap(u, v);
    if (memo[u].count(v))
        return memo[u][v];
    int &ret = memo[u][v];
    for (int j = LOGN - 1; j >= 0; j--)
        if (lvl[u] + (1 << j) <= lvl[v])
            v = par[v][j];
    if (u == v) return ret = u;
    for (int j = LOGN - 1; j >= 0; j--)
        if (par[u][j] != -1 && par[u][j] != par[v][j])
            u = par[u][j], v = par[v][j];
    return ret = par[u][0];
}

ll far(int u, int v) {
    int l = LCA(u, v);
    return dist[u] + dist[v] - dist[l] * 2LL;
}
*/
ll Query(int S, int X[], int T, int Y[]) {
    for (int i = 0; i < S; i++) {
        int u = X[i], c = 0;
        while (u != -1) {
            ans[u] = min(ans[u], dist[X[i]][c++]);
            u = cpar[u];
        }
    }
    ll res = INF;
    for (int i = 0; i < T; i++) {
        int u = Y[i], c = 0;
        while (u != -1) {
            res = min(res, dist[Y[i]][c++] + ans[u]);
            u = cpar[u];
        }
    }
    for (int i = 0; i < S; i++) {
        int u = X[i];
        while (u != -1) {
            ans[u] = INF;
            u = cpar[u];
        }
    }
    return res;
}


# Verdict Execution time Memory Grader output
1 Correct 13 ms 136108 KB Output is correct
2 Correct 419 ms 136372 KB Output is correct
3 Correct 403 ms 136372 KB Output is correct
4 Correct 383 ms 136372 KB Output is correct
5 Correct 446 ms 136668 KB Output is correct
6 Correct 306 ms 136408 KB Output is correct
7 Correct 446 ms 136372 KB Output is correct
8 Correct 419 ms 136372 KB Output is correct
9 Correct 429 ms 136664 KB Output is correct
10 Correct 299 ms 136408 KB Output is correct
11 Correct 439 ms 136372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 136108 KB Output is correct
2 Correct 3269 ms 161848 KB Output is correct
3 Correct 5213 ms 166940 KB Output is correct
4 Correct 1018 ms 160004 KB Output is correct
5 Execution timed out 6000 ms 200148 KB Execution timed out
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3373 ms 161848 KB Output is correct
2 Correct 3536 ms 161848 KB Output is correct
3 Correct 4693 ms 165460 KB Output is correct
4 Correct 4723 ms 166340 KB Output is correct
5 Correct 4649 ms 166112 KB Output is correct
6 Execution timed out 6000 ms 191484 KB Execution timed out
7 Halted 0 ms 0 KB -