답안 #660353

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
660353 2022-11-21T17:36:01 Z rafatoa 공장들 (JOI14_factories) C++17
100 / 100
5615 ms 213588 KB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("Ofast")

#define F first
// #define S second
#define vi vector<int>
#define vvi vector<vi>
#define pi pair<int, int>
#define vpi vector<pi>
#define vb vector<bool>
#define vvb vector<vb>
#define pb push_back
#define ppb pop_back
#define read(a) for(auto &x:a) cin >> x;
#define print(a) for(auto x:a) cout << x << " "; cout << "\n";
#define vc vector<char>
#define vvc vector<vc>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
 
#define double ld
// #define int long long
const long long INF = 4e18;

const int N = 5e5+1;

int n;
vpi adj[N];
int st[2*N][21];
long long d[N], dc[N], sub[N], par[N], best[N], vis[N], tin[N], eul[2*N], lg[2*N];
bool del[N];

int tt = 0;

int cmp(int a, int b){
    return (d[a] < d[b] ? a : b);
}

int lca(int a, int b){
    if(tin[a] > tin[b]) swap(a, b);
    int len = tin[b]-tin[a]+1;
    return cmp(st[tin[a]][lg[len]], st[tin[b]-(1LL<<lg[len])+1][lg[len]]);
}

long long dist(int a, int b){
    return dc[a]+dc[b]-2*dc[lca(a, b)];
}

void build(){
    int time = 0;
    function<void(int, int)> dfs0 = [&](int s, int e){
        tin[s] = time;
        eul[time++] = s;
        for(auto [u, c]:adj[s]){
            if(u == e) continue;
            d[u] = d[s]+1;
            dc[u] = dc[s]+c;
            dfs0(u, s);
            eul[time++] = s;
        }
    };
    dfs0(1, 0);

    for(int i=0; i<2*n-1; i++) st[i][0] = eul[i];
    for(int j=1; j<=20; j++)
    for(int i=0; i+(1LL<<j)-1<2*n-1; i++)
        st[i][j] = cmp(st[i][j-1], st[i+(1LL<<(j-1))][j-1]);

    //START_CENTROID

    function<void(int, int)> dfs_sub = [&](int s, int e){
        sub[s] = 1;
        for(auto [u, c]:adj[s]){
            if(u == e || del[u]) continue;
            dfs_sub(u, s);
            sub[s] += sub[u];
        }
    };

    function<int(int, int, int)> centroid = [&](int s, int e, int sz){
        for(auto [u, c]:adj[s])
            if(u != e && !del[u] && sub[u] > sz/2) return centroid(u, s, sz);
        return s;
    };

    function<void(int, int)> decompose = [&](int s, int p){
        dfs_sub(s, 0);
        int C = centroid(s, 0, sub[s]);
        par[C] = p;

        del[C] = 1;
        for(auto [u, c]:adj[C])
            if(!del[u]) decompose(u, C);
    };
    decompose(1, -1);

    //END_CENTROID
}

void Init(int N, int A[], int B[], int D[]){
    n = N;
    lg[1] = 0;
    for(int i=2; i<2*N; i++)
        lg[i] = lg[i/2]+1;
    for(int i=0; i<n-1; i++){
        adj[A[i]+1].pb({B[i]+1, D[i]});
        adj[B[i]+1].pb({A[i]+1, D[i]});
    }

    build();
}

long long Query(int S, int X[], int T, int Y[]){
    tt++;
    long long ans = INF;
    
    for(int i=0; i<T; i++){
        Y[i]++;
        int curr = Y[i];
        while(curr != -1){
            if(vis[curr] < tt){
                vis[curr] = tt;
                best[curr] = INF;
            }
            best[curr] = min(best[curr], dist(curr, Y[i]));
            curr = par[curr];
        }
    }

    for(int i=0; i<S; i++){
        X[i]++;
        int curr = X[i];
        while(curr != -1){
            if(vis[curr] < tt){
                vis[curr] = tt;
                best[curr] = INF;
            }
            ans = min(ans, best[curr]+dist(curr, X[i]));
            curr = par[curr];
        }
    }

    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 12512 KB Output is correct
2 Correct 397 ms 21600 KB Output is correct
3 Correct 536 ms 21580 KB Output is correct
4 Correct 513 ms 21588 KB Output is correct
5 Correct 498 ms 22000 KB Output is correct
6 Correct 197 ms 21596 KB Output is correct
7 Correct 510 ms 21584 KB Output is correct
8 Correct 518 ms 21604 KB Output is correct
9 Correct 515 ms 22008 KB Output is correct
10 Correct 233 ms 21648 KB Output is correct
11 Correct 507 ms 21600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 12372 KB Output is correct
2 Correct 2151 ms 169240 KB Output is correct
3 Correct 3302 ms 173488 KB Output is correct
4 Correct 1148 ms 169940 KB Output is correct
5 Correct 4481 ms 213588 KB Output is correct
6 Correct 3097 ms 174564 KB Output is correct
7 Correct 1589 ms 52316 KB Output is correct
8 Correct 503 ms 52608 KB Output is correct
9 Correct 1750 ms 57876 KB Output is correct
10 Correct 1723 ms 53616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 12512 KB Output is correct
2 Correct 397 ms 21600 KB Output is correct
3 Correct 536 ms 21580 KB Output is correct
4 Correct 513 ms 21588 KB Output is correct
5 Correct 498 ms 22000 KB Output is correct
6 Correct 197 ms 21596 KB Output is correct
7 Correct 510 ms 21584 KB Output is correct
8 Correct 518 ms 21604 KB Output is correct
9 Correct 515 ms 22008 KB Output is correct
10 Correct 233 ms 21648 KB Output is correct
11 Correct 507 ms 21600 KB Output is correct
12 Correct 7 ms 12372 KB Output is correct
13 Correct 2151 ms 169240 KB Output is correct
14 Correct 3302 ms 173488 KB Output is correct
15 Correct 1148 ms 169940 KB Output is correct
16 Correct 4481 ms 213588 KB Output is correct
17 Correct 3097 ms 174564 KB Output is correct
18 Correct 1589 ms 52316 KB Output is correct
19 Correct 503 ms 52608 KB Output is correct
20 Correct 1750 ms 57876 KB Output is correct
21 Correct 1723 ms 53616 KB Output is correct
22 Correct 2895 ms 170836 KB Output is correct
23 Correct 2990 ms 173176 KB Output is correct
24 Correct 4915 ms 174744 KB Output is correct
25 Correct 4820 ms 178704 KB Output is correct
26 Correct 4466 ms 175276 KB Output is correct
27 Correct 5615 ms 207636 KB Output is correct
28 Correct 1110 ms 174040 KB Output is correct
29 Correct 4516 ms 174780 KB Output is correct
30 Correct 4730 ms 174088 KB Output is correct
31 Correct 4588 ms 175008 KB Output is correct
32 Correct 2017 ms 59276 KB Output is correct
33 Correct 563 ms 53280 KB Output is correct
34 Correct 1247 ms 50200 KB Output is correct
35 Correct 1331 ms 50508 KB Output is correct
36 Correct 1840 ms 51180 KB Output is correct
37 Correct 1742 ms 51244 KB Output is correct