Submission #1200531

#TimeUsernameProblemLanguageResultExecution timeMemory
1200531CabralbonzaoHarbingers (CEOI09_harbingers)C++20
20 / 100
232 ms119472 KiB
#include <bits/stdc++.h>
using namespace std;

mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());

#define N 100010
#define K 102
#define MV 1000000010
#define INFLL 1000000000000000010
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front

typedef long long ll;
typedef pair<ll,ll> pll;
typedef vector< ll > vl;
typedef vector< pll > vll;

struct Node
{
    ll a;
    ll b;
    ll u;

    ll getval(ll x)
    {
        return a*x+b;
    }

};

struct Line
{
    vector<Node>nodes;
    ll lef=-1;
    ll rig=-1;
};

stack<ll>pilha;
vector<Line>lines;
Line lx;
vector<pll>grafo[N];
ll dp[N];
ll d[N];
ll s[N];
ll c[N];
bool active[N];

ll createl()
{
    lines.pb(lx);
    lines.back().nodes.pb({0,0,1});
    return lines.size()-1;
}

void update(ll i,ll l,ll r,Node cur)
{
    ll mid=((l+r)>>1LL);
    ll lef=lines[i].lef;
    ll rig=lines[i].rig;
    while(!active[lines[i].nodes.back().u])
    {
        lines[i].nodes.ppb();
    }
    ll pos=lines[i].nodes.size()-1;
    if(l==r-1)
    {
        if(cur.getval(l)<lines[i].nodes[pos].getval(l))
        {
            lines[i].nodes.pb(cur);
        }
        return;
    }
    Node auxc=cur;
    Node auxl=lines[i].nodes[pos];
    bool swi=false;
    if(auxc.a>auxl.a)
        swap(auxc,auxl),swi=true;
    if(auxc.getval(mid)<auxl.getval(mid))
    {
        lines[i].nodes.pb(auxc);
        cur=auxl;
        if(lef==-1)
            lef=createl();
        update(lef,l,mid,cur);
    }else
    {
        lines[i].nodes.pb(auxl);
        cur=auxc;
        if(rig==-1)
            rig=createl();
        update(rig,mid,r,cur);
    }
    lines[i].lef=lef;
    lines[i].rig=rig;
    return;
}

ll query(ll i,ll l,ll r,ll x)
{
    if(i==-1)
        return INFLL;
    while(!active[lines[i].nodes.back().u])
    {
        lines[i].nodes.ppb();
    }
    ll pos=lines[i].nodes.size()-1;
    if(l==r-1)
        return lines[i].nodes[pos].getval(x);
    ll mid=((l+r)>>1LL);
    ll lef=lines[i].lef;
    ll rig=lines[i].rig;
    if(x<mid)
        return min(lines[i].nodes[pos].getval(x),query(lef,l,mid,x));
    return min(lines[i].nodes[pos].getval(x),query(rig,mid,r,x));
}

void DFS(ll u,ll p)
{
    active[u]=true;
    if(u==p)
    {
        createl();
    }
    dp[u]=d[u]*s[u]+c[u]+query(0,0,MV,s[u]);
    Node cur={-d[u],dp[u],u};
    update(0,0,MV,cur);
    for(auto [v,w] : grafo[u])
    {
        if(v==p)
            continue;
        d[v]=d[u]+w;
        DFS(v,u);
    }
    active[u]=false;
    return;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    
    ll n,u,v,w;

    cin >> n;
    for(ll i=2;i<=n;i++)
    {
        cin >> u >> v >> w;
        grafo[u].pb({v,w});
        grafo[v].pb({u,w});
    }
    for(ll i=2;i<=n;i++)
    {
        cin >> c[i] >> s[i];
    }
    DFS(1,1);
    for(ll i=2;i<=n;i++)
    {
        cout << dp[i] << ((i==n) ? '\n' : ' ');
    }

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...