Submission #612741

# Submission time Handle Problem Language Result Execution time Memory
612741 2022-07-29T22:58:17 Z RandomLB Harbingers (CEOI09_harbingers) C++17
100 / 100
121 ms 21756 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
#define siz(x) (int)x.size()
#define pb push_back
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
/*===========================================

===========================================*/
const int MAX = 1e5+5;
vector<pi> adj[MAX];
int sub[MAX], pp[MAX], heavy[MAX], in[MAX], head[MAX], curr;
ll a[MAX], b[MAX], dep[MAX], dp[MAX];
vector<int> q[MAX];

int dfs(int v, int p){
    for (auto[u, w]: adj[v]){
        if (u == p) continue;
        pp[u] = v;
        dep[u] = dep[v]+w;
        sub[v] += dfs(u, v);
        if (sub[u] > sub[heavy[v]]) heavy[v] = u;
    }
    return ++sub[v];
}

void decomp(int v, int h, int p){
    in[v] = ++curr;
    head[v] = h;
    if (heavy[v]) decomp(heavy[v], h, v);
    for (auto[u, w]: adj[v]){
        if (u == p || u == heavy[v]) continue;
        decomp(u, u, v);
    }
}

ll dv(ll x, ll y) { // floored division
		return x / y - ((x ^ y) < 0 && x % y); }

inline ll sect(int x, int y){ return dv(dp[y]-dp[x], dep[y]-dep[x]); }

int query(int i, ll x){
    int l = -1, r = siz(q[i])-1;
    while (l+1 < r){
        int m = l+(r-l)/2;
        if (sect(q[i][m], q[i][m+1]) >= x) r = m;
        else l = m;
    }
    return q[i][r];
}

void add(int i, int x){
    while (siz(q[i]) > 1
    && sect(q[i].back(), q[i][siz(q[i])-2]) >= sect(q[i].back(), x))
        q[i].pop_back();
    q[i].pb(x);
}

void solve(int v, int p){
    int x = v;
    if (x == head[x]) x = pp[x];
    while (x){
        int u = query(head[x], b[v]);
        dp[v] = min(dp[v], a[v]+b[v]*dep[v] - b[v]*dep[u]+dp[u]);
        x = pp[head[x]];
    }
    add(head[v], v);
    for (auto[u, w]: adj[v]){
        if (u == p || u == heavy[v]) continue;
        solve(u, v);
    }
    if (heavy[v]) solve(heavy[v], v);
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n; cin >> n;
    for (int i = 1; i < n; i++){
        int a, b, w;
        cin >> a >> b >> w;
        adj[a].pb({b, w});
        adj[b].pb({a, w});
    }
    for (int i = 2; i <= n; i++){
        cin >> a[i] >> b[i];
        dp[i] = LLINF;
    }
    dfs(1, -1);
    decomp(1, 1, -1);
    solve(1, -1);
    for (int i = 2; i <= n; i++) cout << dp[i] << (i==n?"\n":" ");
}
# Verdict Execution time Memory Grader output
1 Correct 3 ms 5076 KB Output is correct
2 Correct 4 ms 5460 KB Output is correct
3 Correct 40 ms 12048 KB Output is correct
4 Correct 57 ms 15580 KB Output is correct
5 Correct 77 ms 18648 KB Output is correct
6 Correct 97 ms 21756 KB Output is correct
7 Correct 57 ms 13752 KB Output is correct
8 Correct 113 ms 18624 KB Output is correct
9 Correct 121 ms 20936 KB Output is correct
10 Correct 109 ms 20024 KB Output is correct