#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define endl '\n'
#define pb push_back
using namespace std;
const int max_n=1e5+1;
int n,d,x,y,h[max_n];
ll dp[max_n];
ll S[max_n],V[max_n];
pair<int,ll> node;
vector<pair<int,int>> v[max_n];
vector<pair<int,ll>> cht;
void INP()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin>>n;
    for (int i=1;i<n;++i)
    {
        cin>>x>>y>>d;
        v[x].pb({y,d});
        v[y].pb({x,d});
    }
    for (int i=1;i<n;++i)
        cin>>S[i+1]>>V[i+1];
}
ll eval(pair<int,ll> a,ll x)
{
    return a.fi*x+a.se;
}
bool calc(pair<int,ll> &a,pair<int,ll> &b,pair<int,ll> &c)
{
    // (b.se-a.se)/(a.fi-b.fi)<=(c.se-a.se)/(a.fi-c.fi)
    return (double)(b.se-a.se)/(a.fi-b.fi)<=(double)(c.se-a.se)/(a.fi-c.fi);
    //return (b.se-a.se)*(a.fi-c.fi)<=(c.se-a.se)*(a.fi-b.fi);
}
int l,r,mid,res;
void dfs(int u,int p)
{
    dp[u]=h[u]*V[u]+S[u];
    int sz=cht.size();
    if (sz!=0)
    {
        if (sz==1)
        dp[u]+=eval(cht[0],V[u]); else
        {
            l=0; r=sz-2; res=0;
            while (l<=r)
            {
                mid =(l+r)>>1;
                if (eval(cht[mid],V[u])>=eval(cht[mid+1],V[u]))
                {
                    res=mid;
                    l=mid+1;
                } else
                r=mid-1;
            }
            if (res+1<=sz-1&&eval(cht[res],V[u])>=eval(cht[res+1],V[u]))
            ++res;
            //for (auto it : cht)
            //cout<<u<<' '<<eval(it,V[u])<<endl;
            dp[u]+=eval(cht[res],V[u]);
        }
    }
    // dp[u] = dist[u]*v[u] + s[u] -dist[v]*v[u] + dp[v]
    node = {-h[u],dp[u]};
    vector<pair<int,ll>> roll;
    while (cht.size()>=2&&calc(node,cht.back(),cht[cht.size()-2]))
    {
        roll.pb(cht.back());
        cht.pop_back();
    }
    cht.push_back(node);
    for (auto &it : v[u])
    if (it.fi!=p)
    {
        h[it.fi]=h[u]+it.se;
        dfs(it.fi,u);
    }
    cht.pop_back();
    if (roll.size()>0)
    for (int i=roll.size()-1;i>=0;--i)
    cht.pb(roll[i]);
}
int main()
{
    INP();
    h[1]=0;
    dfs(1,0);
    for (int i=2;i<=n;++i)
        cout<<dp[i]<<' ';
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |