제출 #1363579

#제출 시각아이디문제언어결과실행 시간메모리
1363579njoopHarbingers (CEOI09_harbingers)C++20
100 / 100
67 ms22040 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

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

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=sz-2;
    while(l < r) {
        int mid = (l+r)/2;
        if(val > calc(dq[mid], dq[mid+1])) l = mid+1;
        else r = mid;
    }
    while(l < sz-1 && calc(dq[l], dq[l+1]) < val) l++; 
    return val*dq[l].first + dq[l].second;
}

void dfs(int no, int rt, int dis) {
    pair<int, int> reml;
    int l=0, r=sz-2, osz = sz;
    if(rt != -1) {
        ans[no] = query(mes[no].first) + mes[no].first * dis + mes[no].second;
        pair<int, int> line = {-dis, ans[no]};
            while(l < r) {
                int mid = (l+r)/2;
                if(calc(dq[mid], dq[mid+1]) <= calc(dq[mid+1], line)) l = mid+1;
                else r = mid;
            }
            while(l < sz-1 && calc(dq[l], dq[l+1]) <= calc(dq[l+1], line)) l++;
            sz = l+2;
            reml = dq[l+1];
            dq[l+1] = line;
        
    }
    for(auto i: g[no]) {
        if(i.first == rt) continue;
        dfs(i.first, no, dis+i.second);
    }
    if(rt != -1) {
        dq[l+1] = reml;
        sz = osz;
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    mes.assign(n+2, {0, 0});
    ans.assign(n+2, 0);
    dq.assign(n+2, {0, 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;
    }
    sz = 1;
    dfs(1, -1, 0);
    for(int i=2; i<=n; i++) {
        cout << ans[i] << " ";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…