Submission #1315118

#TimeUsernameProblemLanguageResultExecution timeMemory
1315118aaaaaaaaFactories (JOI14_factories)C++20
0 / 100
10 ms8624 KiB
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;

const int mxN = 5e5 + 10;
const long long inf = 5e18;

vector<pair<int, int>> adj[mxN];
int st[mxN], en[mxN], tin = 0;
long long sum[mxN], seg[mxN * 2];


void dfs(int u = 0, int par = 0){
    st[u] = ++tin;
    for(auto [v, w] : adj[u]){
        if(v ^ par){
            sum[v] = (long long) sum[u] + w;
            dfs(v, u);
        }
    }
    en[u] = tin;
}

void update(int idx, long long val){
    idx += tin;
    seg[idx] = val;
    while(idx > 1){
        idx >>= 1;
        seg[idx] = min(seg[idx << 1], seg[idx << 1 | 1]);
    }
}

long long query(int l, int r){
    l += tin, r += tin;
    long long ans = inf;
    while(l <= r){
        if(l & 1) ans = min(ans, seg[l ++]);
        if(r & 1 ^ 1) ans = min(ans, seg[r --]);
        l >>= 1, r >>= 1;
    }
    return ans;
}

void Init(int N, int A[], int B[], int D[]) {
    for(int i = 0; i < N - 1; ++i){
        adj[A[i]].push_back({B[i], D[i]});
        adj[B[i]].push_back({A[i], D[i]});
    }
    dfs();
    for(int i = 0; i < 2 * mxN; ++i) seg[i] = inf;
}

long long get(vector<int> A, vector<int> B){
    long long ans = inf;
    for(auto it : A) update(st[it], sum[it]);
    for(auto it : B) ans = min(ans, query(st[it], en[it]) - sum[it]);
    for(auto it : A) update(st[it], inf);
    return ans;
}


long long Query(int S, int X[], int T, int Y[]) {
  vector<int> a, b;
  for(int i = 0; i < S; ++i) a.push_back(X[i]);
  for(int i = 0; i < T; ++i) b.push_back(Y[i]);
  return min(get(a, b), get(b, a));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...