Submission #284940

# Submission time Handle Problem Language Result Execution time Memory
284940 2020-08-28T08:15:59 Z BeanZ Factories (JOI14_factories) C++14
15 / 100
8000 ms 110280 KB
#include <bits/stdc++.h>
#include "factories.h"


using namespace std;

#define ll int
#define endl '\n'
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
const int lg = 19;
vector<pair<ll, ll>> node[N];
ll dp[N][20], dep[N];
long long dis[N];
ll sz[N];
ll par[N];
long long ans[N];
bool ok[N], in[N];
void dfs(ll u, ll p){
        for (int i = 1; i <= lg; i++) dp[u][i] = dp[dp[u][i - 1]][i - 1];
        for (auto j : node[u]){
                if (j.first == p) continue;
                dp[j.first][0] = u;
                dis[j.first] = dis[u] + j.second;
                dep[j.first] = dep[u] + 1;
                dfs(j.first, u);
        }
}
ll findnewCT(ll u, ll p, ll S){
        for (auto j : node[u]){
                if (j.first == p || in[j.first]) continue;
                if ((sz[j.first] * 2) >= S) return findnewCT(j.first, u, S);
        }
        return u;
}
void initsz(ll u, ll p){
        sz[u] = 1;
        for (auto j : node[u]){
                if (j.first == p || in[j.first]) continue;
                initsz(j.first, u);
                sz[u] += sz[j.first];
        }
}
ll findCT(ll u, ll S){
        initsz(u, u);
        u = findnewCT(u, u, S);
        in[u] = 1;
        for (auto j : node[u]){
                if (in[j.first]) continue;
                if (sz[j.first] > sz[u]){
                        ll x = findCT(j.first, S - sz[u]);
                        par[x] = u;
                } else {
                        ll x = findCT(j.first, sz[j.first]);
                        par[x] = u;
                }
        }
        return u;
}
ll LCA(ll u, ll v){
        if (dep[u] > dep[v]) swap(u, v);
        ll dist = dep[v] - dep[u];
        for (int i = lg; i >= 0; i--){
                if (dist & (1 << i)) v = dp[v][i];
        }
        if (u == v) return u;
        for (int i = lg; i >= 0; i--){
                if (dp[u][i] != dp[v][i]){
                        u = dp[u][i];
                        v = dp[v][i];
                }
        }
        return dp[u][0];
}
long long dist(ll u, ll v){
        ll lca = LCA(u, v);
        return dis[u] + dis[v] - 2 * dis[lca];
}
vector<ll> recover;
void upd(ll u, ll root){
        if (!ok[u]) recover.push_back(u), ok[u] = 1;
        if (u == 0) return;
        ans[u] = min(ans[u], dist(root, u));
        upd(par[u], root);
}
long long get(ll u, ll root){
        if (u == 0) return 1e16;
        return min(ans[u] + dist(u, root), get(par[u], root));
}
long long Query(int S, int X[], int T, int Y[]){
        recover.clear();
        for (int i = 1; i <= T; i++){
                upd(Y[i - 1] + 1, Y[i - 1] + 1);
        }
        long long res = 1e18;
        for (int i = 1; i <= S; i++){
                res = min(res, get(X[i - 1] + 1, X[i - 1] + 1));
        }
        for (auto j : recover) ans[j] = 1e18, ok[j] = 0;
        return res;
}
void Init(int n, int A[], int B[], int D[]){
        for (int i = 1; i < n; i++){
                node[A[i - 1] + 1].push_back({B[i - 1] + 1, D[i - 1]});
                node[B[i - 1] + 1].push_back({A[i - 1] + 1, D[i - 1]});
        }
        dfs(1, 1);
        ll root = findCT(1, n);
        for (int i = 1; i <= n; i++) ans[i] = 1e18;
}
/*
int main(){
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        if (fopen("VietCT.INP", "r")){
                freopen("VietCT.INP", "r", stdin);
                freopen("VietCT.OUT", "w", stdout);
        }

}
*/
/*
*/

Compilation message

factories.cpp: In function 'void Init(int, int*, int*, int*)':
factories.cpp:108:12: warning: unused variable 'root' [-Wunused-variable]
  108 |         ll root = findCT(1, n);
      |            ^~~~
# Verdict Execution time Memory Grader output
1 Correct 51 ms 24184 KB Output is correct
2 Correct 1216 ms 32648 KB Output is correct
3 Correct 2098 ms 32892 KB Output is correct
4 Correct 2150 ms 32788 KB Output is correct
5 Correct 2277 ms 32888 KB Output is correct
6 Correct 462 ms 32640 KB Output is correct
7 Correct 2011 ms 32772 KB Output is correct
8 Correct 2066 ms 32712 KB Output is correct
9 Correct 2256 ms 33024 KB Output is correct
10 Correct 460 ms 32888 KB Output is correct
11 Correct 1985 ms 32936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 23988 KB Output is correct
2 Correct 4014 ms 109252 KB Output is correct
3 Execution timed out 8047 ms 110280 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 51 ms 24184 KB Output is correct
2 Correct 1216 ms 32648 KB Output is correct
3 Correct 2098 ms 32892 KB Output is correct
4 Correct 2150 ms 32788 KB Output is correct
5 Correct 2277 ms 32888 KB Output is correct
6 Correct 462 ms 32640 KB Output is correct
7 Correct 2011 ms 32772 KB Output is correct
8 Correct 2066 ms 32712 KB Output is correct
9 Correct 2256 ms 33024 KB Output is correct
10 Correct 460 ms 32888 KB Output is correct
11 Correct 1985 ms 32936 KB Output is correct
12 Correct 20 ms 23988 KB Output is correct
13 Correct 4014 ms 109252 KB Output is correct
14 Execution timed out 8047 ms 110280 KB Time limit exceeded
15 Halted 0 ms 0 KB -