Submission #1363564

#TimeUsernameProblemLanguageResultExecution timeMemory
1363564njoopHarbingers (CEOI09_harbingers)C++20
10 / 100
134 ms131072 KiB
#include <bits/stdc++.h>

using namespace std;

deque<pair<int, int>> dq;
vector<int> ans;
vector<pair<int, int>> mes;
vector<vector<pair<int, int>>> g;
int sum;

double calc(pair<int, int> a, pair<int, int> b) {
    return double(b.second-a.second)/double(a.first-b.first);
}

int query(int val) {
    int l=0, r=dq.size()-2;
    while(l < r) {
        int mid = (l+r)/2;
        if(val > calc(dq[mid], dq[mid+1])) l = mid+1;
        else r = mid;
    }
    if(val > calc(dq[l], dq[l+1])) l++;
    return val*dq[l].first + dq[l].second;
}

void dfs(int no, int rt, int dis) {
    stack<pair<int, int>> rem, upd;
    if(rt != -1) {
        ans[no] = mes[no].first * dis + mes[no].second; 
        if(dq.size() != 0) ans[no] = min(ans[no], query(mes[no].first) + dis*mes[no].first + mes[no].second);
        pair<int, int> l = {-dis, ans[no]};
        while(dq.size() > 1 && calc(dq[dq.size()-2], dq.back()) >= calc(dq.back(), l)) {
            rem.push(dq.back());
            dq.pop_back();
        }
        upd.push(l);
        dq.push_back(l);
    }
    for(auto i: g[no]) {
        if(i.first == rt) continue;
        dfs(i.first, no, dis+i.second);
    }
    while(!upd.empty()) {
        dq.pop_back();
        upd.pop();
    }
    while(!rem.empty()) {
        dq.push_back(rem.top());
        rem.pop();
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    mes.assign(n+2, {0, 0});
    ans.assign(n+2, 0);
    g.assign(n+2, vector<pair<int, int>>());
    for(int i=1; i<n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }
    for(int i=2; i<=n; i++) {
        cin >> mes[i].second >> mes[i].first;
    }
    dfs(1, -1, 0);
    for(int i=2; i<=n; i++) {
        cout << ans[i] << " ";
    }
}
#Result Execution timeMemoryGrader output
Fetching results...