Submission #26443

# Submission time Handle Problem Language Result Execution time Memory
26443 2017-06-30T09:47:47 Z chpipis Factories (JOI14_factories) C++11
33 / 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) {
    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);
            sz[u] += sz[v.fi];
        }
}

void proc(int u, int p, int dep) {
    ll w = dist[u][dep];
    mark[u] = true;
    for (auto v : gr[u])
        if (v.fi != p && !mark[v.fi]) {
            dist[v.fi][dep] = w + v.se;
            proc(v.fi, u, dep);
        }
}

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

int decompose(int u, int p, const int n, int dep) {
    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;
        lvl[u] = dep;
        //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);

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

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

                init(cent);

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

                //init(cent, true);
            }
        //printf("END OF VISIT OF %d\n", u);
        return u;
    } else {
        return decompose(big, u, n, dep);
    }
}

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);
    //memset(lvl, -1, sizeof lvl);
    //memset(dist, -1, sizeof dist);
    root = decompose(0, -1, sz[0], 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 = lvl[X[i]];
        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 = lvl[Y[i]];
        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 6 ms 136108 KB Output is correct
2 Correct 346 ms 136372 KB Output is correct
3 Correct 409 ms 136372 KB Output is correct
4 Correct 456 ms 136372 KB Output is correct
5 Correct 413 ms 136664 KB Output is correct
6 Correct 363 ms 136408 KB Output is correct
7 Correct 406 ms 136372 KB Output is correct
8 Correct 463 ms 136372 KB Output is correct
9 Correct 489 ms 136668 KB Output is correct
10 Correct 303 ms 136408 KB Output is correct
11 Correct 483 ms 136372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 136108 KB Output is correct
2 Correct 2813 ms 161848 KB Output is correct
3 Correct 4283 ms 166940 KB Output is correct
4 Correct 829 ms 160004 KB Output is correct
5 Correct 5176 ms 200148 KB Output is correct
6 Correct 4309 ms 166300 KB Output is correct
7 Correct 1303 ms 142148 KB Output is correct
8 Correct 576 ms 141360 KB Output is correct
9 Correct 1596 ms 146004 KB Output is correct
10 Correct 1169 ms 142000 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3156 ms 161848 KB Output is correct
2 Correct 3073 ms 161848 KB Output is correct
3 Correct 4389 ms 165460 KB Output is correct
4 Correct 4969 ms 166344 KB Output is correct
5 Correct 4646 ms 166112 KB Output is correct
6 Execution timed out 6000 ms 191488 KB Execution timed out
7 Halted 0 ms 0 KB -