Submission #1288968

#TimeUsernameProblemLanguageResultExecution timeMemory
1288968NewtonabcHarbingers (CEOI09_harbingers)C++20
30 / 100
140 ms21392 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int cnt=0;
ll dp[N],d[N],vl[N],s[N];
vector<pair<int,ll>> adj[N];
struct line{
    ll m,c;
    double cut(line b){return (double)(b.c-c)/(double)(m-b.m);}
    double val(ll x){return m*x+c;}
}st[N];
bool bad(line a,line b,line c){return c.cut(a)>=c.cut(b);}
ll query(ll x){
    int l=0,r=cnt-1;
    while(l<r){
        int mid=(l+r+1)/2;
        if(st[mid].cut(st[mid-1])<=x) l=mid;
        else r=mid-1;
    }
    return st[l].val(x);
}
int ins(line li){
    int l=0,r=cnt-1;
    if(cnt<2 || !bad(st[cnt-2],st[cnt-1],li)) return cnt;
    while(l<r){
        int mid=(l+r)/2;
        if(bad(st[mid-1],st[mid],li)) r=mid;
        else l=mid+1;
    }
    return l;
}
void dfs(int u,int p){
    int pi,pcnt;
    line pl;
    dp[u]=s[u]+d[u]*vl[u]+query(vl[u]);
    line l={-d[u],dp[u]};
    pi=ins(l);
    pl=st[pi];
    pcnt=cnt;
    st[pi]=l;
    cnt=pi+1;
    //cout<<u <<"\n";
    //for(int i=0;i<cnt;i++) cout<<st[i].m <<" " <<st[i].c <<"\n";
    for(auto [v,w]:adj[u]){
        if(v==p) continue;
        d[v]=d[u]+w;
        dfs(v,u);
    }
    cnt=pcnt;
    st[pi]=pl;
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n-1;i++){
        int u,v;
        ll w;
        cin>>u >>v >>w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }
    for(int i=2;i<=n;i++) cin>>s[i] >>vl[i];
    dfs(1,1);
    for(int i=2;i<=n;i++) cout<<dp[i] <<" ";
}
#Verdict Execution timeMemoryGrader output
Fetching results...