제출 #1094889

#제출 시각아이디문제언어결과실행 시간메모리
1094889doducanhHarbingers (CEOI09_harbingers)C++14
100 / 100
74 ms24480 KiB
///breaker
///every second counts
#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define ii pair<ll,ll>
#define mp make_pair
#define in(x) freopen(x,"r",stdin)
#define out(x) freopen(x,"w",stdout)
#define bit(x,i) ((x>>i)&1)
#define lc (id<<1)
#define rc ((id<<1)^1)
const int maxn=1e5+7;
int n;
vector<ii>adj[maxn];
ll f[maxn];
ii chiso[maxn];
int maxst=0;
struct line
{
    ll m,b;
    line(ll m=0,ll b=0):m(m),b(b){}
    ll operator()(ll x){return 1ll*m*x+b;}
    friend double slope(const line &a,const line &b)
    {
        return (double)-(a.b-b.b)/(a.m-b.m);
    }
}st[maxn];
ll getmin(ll x)
{
    int l=0,r=maxst-1;
    while(l<r){
        int m=(l+r)/2;
        if(slope(st[m],st[m+1])<x){
            l=m+1;
        }
        else r=m;
    }
    return st[l](x);
}
int removeline(line x)
{
    if(maxst<2||slope(st[maxst-2],st[maxst-1])<=slope(st[maxst-1],x))return maxst;
    int l=1,r=maxst-1;
    while(l<r){
        int m=(l+r)/2;
        if(slope(st[m-1],st[m])>slope(st[m],x)){
            r=m;
        }
        else l=m+1;
    }
    return l;
}
void dfs(int u,int par,ll h)
{
    int premax,prepos;
    line preline;
    if(u!=1){
        f[u]=getmin(chiso[u].se)+chiso[u].fi+1ll*chiso[u].se*h;
        line l={-h,f[u]};
        premax=maxst;
        prepos=maxst=removeline(l);
        preline=st[maxst];
        st[maxst++]=l;
    }
    else{
        f[u]=0;
        st[maxst++]={0,0};
    }
    for(ii x:adj[u]){
        int v=x.fi;
        int w=x.se;
        if(v==par)continue;
        dfs(v,u,h+w);
    }
    if(u!=1){
        maxst=premax;
        st[prepos]=preline;
    }

}
void sol(void){
    cin>>n;
    for(int i=1;i<n;i++){
        int u,v,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>>chiso[i].fi>>chiso[i].se;
    }
    dfs(1,0,0);
    for(int i=2;i<=n;i++)cout<<f[i]<<" ";
}
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    while(t--){
        sol();
    }
    // you should actually read the stuff at the bottom
    return 0;
}
/* stuff you should look for
 * int overflow, array bounds
 * special cases (n=1?)
 * do smth instead of nothing and stay organized
 * WRITE STUFF DOWN
 * DON'T GET STUCK ON ONE APPROACH
 */
#Verdict Execution timeMemoryGrader output
Fetching results...