Submission #398199

# Submission time Handle Problem Language Result Execution time Memory
398199 2021-05-03T23:25:01 Z Encodeous Factories (JOI14_factories) C++11
15 / 100
1551 ms 190208 KB
#include <bits/stdc++.h>
#include "factories.h"
#pragma message("Compiling at: " __TIMESTAMP__ ". Executing File: " __FILE__ ". If this date is not the same as the submission date, it could be an indication that the submission was rejudged.")
#ifdef DEBUG
#pragma message("Attention, this program is running in DEBUG mode! Performance will be affected")
#else
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#endif
using namespace std;
#define ll long long
#define lp pair<ll,ll>
#define ld long double
#define ms(x, y) memset(x, 0, sizeof(x))
#define l2(x) ((x==0)? 0 :31 - __builtin_clz(x))
int cur = 0;
int head[500001], vnext[1000001], adj[1000001], weight[1000001];
int cnt[500001];
int cqstat[500001];
bitset<500001> blocked;
int parent[500001];
ll ct_val[500001];
ll ct_dist[20][500001];
int depth[500001];

//int find_centroid(int x, int p, int sz){
//    for(int i = head[x]; i != -1; i = vnext[i]){
//        if(adj[i] != p && !blocked[adj[i]] && cnt[adj[i]] > sz / 2){
//            return find_centroid(adj[i], x, sz);
//        }
//    }
//    return x;
//}
int ffind_centroid(int x){
    //visited.reset();
    int sz = cnt[x];
    int v = x;
    int p = -1;

    while(true){
        bool any = false;
        for(int i = head[v]; i != -1; i = vnext[i]){
            if(adj[i] != p && !blocked[adj[i]] && cnt[adj[i]] * 2 > sz){
                p = v;
                v = adj[i];
                any = true;
                break;
            }
        }
        if(!any) return v;
    }
}
int tlen = 0;
int req_tour[500001];
int req_size(int x, int p){
    if(blocked[x]) return 0;
    cnt[x] = 1;
//    req_tour[tlen++] = x;
    for(int i = head[x]; i != -1; i = vnext[i]){
        if(adj[i] != p && !blocked[x]){
            cnt[x] += req_size(adj[i], x);
        }
    }
    return cnt[x];
}
void req_dist(int x, int p, int d){
    if(blocked[x]) return;
    for(int i = head[x]; i != -1; i = vnext[i]){
        if(adj[i] != p && !blocked[x]){
            ct_dist[d][adj[i]] = ct_dist[d][x] + weight[i];
            req_dist(adj[i], x, d);
        }
    }
}
void build_centroid_tree(int x, int p, int d){
    tlen = 0;
    req_size(x, x);
    x = ffind_centroid(x);
    depth[x] = d;
    req_dist(x, x, d);
    blocked[x] = true;
    parent[x] = p;
    for(int i = head[x]; i != -1; i = vnext[i]){
        if(!blocked[adj[i]]){
            build_centroid_tree(adj[i], x, d+1);
        }
    }
}
#define get_dist(c,i) (ct_dist[depth[c]][i])
void update(int x, int qstat){
    int idx = 0;
    for(int c = x; c != -1; c = parent[c]){
        ll d = get_dist(c,x);
        if(cqstat[c] != qstat) {
            ct_val[c] = d;
            cqstat[c] = qstat;
        }
        ct_val[c] = min(ct_val[c], d);
        idx++;
    }
}
ll query(int x, int qstat){
    int q = 0;
    ll minv = 1e17;
    for(int c = x ; c != -1; c = parent[c]) {
        ll d = get_dist(c,x);
        if(cqstat[c] == qstat){
            minv = min(minv, ct_val[c] + d);
        }
        q++;
    }
    return minv;
}
void update2(int x){
    for(int c = x; c != -1; c = parent[c]){
        ll d = get_dist(c,x);
        ct_val[c] = min(ct_val[c], d);
    }
}
void clean(int x){
    for(int c = x; c != -1; c = parent[c]){
        ct_val[c] = 1e17;
    }
}
ll query2(int x){
    ll minv = 1e17;
    for(int c = x ; c != -1; c = parent[c]) {
        ll d = get_dist(c,x);
        minv = min(minv, ct_val[c] + d);
    }
    return minv;
}
void Init(int N, int A[], int B[], int D[]){
    fill(ct_val, ct_val + 500001, 1e17);
    fill(parent, parent + 500001, -1);
    fill(head, head + 500001, -1);
    int x = 0;
    for(int i =0 ; i < N-1; i++){
        int u = A[i];
        int v = B[i];
        adj[cur] = v; weight[cur] = D[i]; vnext[cur] = head[u]; head[u] = cur++;
        adj[cur] = u; weight[cur] = D[i]; vnext[cur] = head[v]; head[v] = cur++;
        x = A[i];
    }
    auto start = chrono::system_clock::now();
    build_centroid_tree(x, -1, 0);
    auto dur = chrono::duration<double, std::milli>(chrono::system_clock::now() - start).count();
    assert(dur <= 1000);
}
int curqstat = 1;
ll Query(int S, int X[], int T, int Y[]){
    if(false){
        curqstat++;
        for(int i = 0; i < S; i++){
            update(X[i], curqstat);
        }
        ll mind = 1e17;
        for(int i = 0; i < T; i++){
            mind = min(mind, query(Y[i], curqstat));
        }
        return mind;
    }
    for(int i = 0; i < S; i++){
        update2(X[i]);
    }
    ll mind = 1e17;
    for(int i = 0; i < T; i++){
        mind = min(mind, query2(Y[i]));
    }
    for(int i = 0; i < S; i++){
        clean(X[i]);
    }
    return mind;
}

//int main(){
//    int N, Q;
//    assert(scanf("%i %i", &N, &Q) == 2);
//    int *A = (int*)malloc(sizeof(int) * (N - 1));
//    int *B = (int*)malloc(sizeof(int) * (N - 1));
//    int *D = (int*)malloc(sizeof(int) * (N - 1));
//    for(int a = 0; a < N - 1; a++){
//        assert(scanf("%i %i %i", A + a, B + a, D + a) == 3);
//    }
//    Init(N, A, B, D);
//    for(int a = 0; a < Q; a++){
//        int S, T;
//        assert(scanf("%i %i", &S, &T) == 2);
//        int *X = (int*)malloc(sizeof(int) * S);
//        int *Y = (int*)malloc(sizeof(int) * T);
//        for(int b = 0; b < S; b++){
//            assert(scanf("%i", X + b) == 1);
//        }
//        for(int b = 0; b < T; b++){
//            assert(scanf("%i", Y + b) == 1);
//        }
//        printf("%i\n", Query(S, X, T, Y));
//        free(X);
//        free(Y);
//    }
//    free(A);
//    free(B);
//    free(D);
//}

Compilation message

factories.cpp:3:194: note: #pragma message: Compiling at: Mon May  3 23:25:07 2021. Executing File: factories.cpp. If this date is not the same as the submission date, it could be an indication that the submission was rejudged.
    3 | #pragma message("Compiling at: " __TIMESTAMP__ ". Executing File: " __FILE__ ". If this date is not the same as the submission date, it could be an indication that the submission was rejudged.")
      |                                                                                                                                                                                                  ^
# Verdict Execution time Memory Grader output
1 Correct 12 ms 8652 KB Output is correct
2 Correct 365 ms 17008 KB Output is correct
3 Correct 392 ms 16996 KB Output is correct
4 Correct 388 ms 17056 KB Output is correct
5 Correct 421 ms 17316 KB Output is correct
6 Correct 271 ms 16452 KB Output is correct
7 Correct 397 ms 17116 KB Output is correct
8 Correct 389 ms 17012 KB Output is correct
9 Correct 419 ms 17264 KB Output is correct
10 Correct 267 ms 16460 KB Output is correct
11 Correct 388 ms 17056 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8396 KB Output is correct
2 Runtime error 1551 ms 190208 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 12 ms 8652 KB Output is correct
2 Correct 365 ms 17008 KB Output is correct
3 Correct 392 ms 16996 KB Output is correct
4 Correct 388 ms 17056 KB Output is correct
5 Correct 421 ms 17316 KB Output is correct
6 Correct 271 ms 16452 KB Output is correct
7 Correct 397 ms 17116 KB Output is correct
8 Correct 389 ms 17012 KB Output is correct
9 Correct 419 ms 17264 KB Output is correct
10 Correct 267 ms 16460 KB Output is correct
11 Correct 388 ms 17056 KB Output is correct
12 Correct 5 ms 8396 KB Output is correct
13 Runtime error 1551 ms 190208 KB Execution killed with signal 6
14 Halted 0 ms 0 KB -