#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
int const N=1e5+10;
vector<pair<int,int>>nei[N]={};
int dist[N]={};
int dp[N]={};
int V[N],S[N];
vector<pii>hull={};
inline bool com(pii a,pii b)
{
if (a.fi/a.se!=b.fi/b.se)
return a.fi/a.se < b.fi/b.se;
a.fi%=a.se;
b.fi%=b.se;
return (a.fi*b.se<b.fi*a.se);
}
inline bool cw(pii a,pii b,pii c)
{
return com({b.fi-a.fi,a.se-b.se},{c.fi-b.fi,b.se-c.se});
}
inline void insert(pii x)
{
if (hull.size()&&hull.back()==x) return;
while (hull.size()>1&&!cw(hull[hull.size()-2],hull.back(),x))
hull.pop_back();
hull.push_back(x);
}
inline int vl(pii a,int x)
{
return x*a.se+a.fi;
}
int query(int x)
{
int ans=vl(hull[0],x);
int st=1,en=hull.size()-1;
while (st<=en)
{
int mid=(st+en)/2;
int ans1=vl(hull[mid-1],x),ans2=vl(hull[mid],x);
if (ans1<ans2)
{
ans=min(ans,ans1);
en=mid-1;
}
else
{
ans=min(ans,ans2);
st=mid+1;
}
}
return ans;
}
vector<int>anc;
void dfs1(int u,int p=-1)
{
if (p!=-1)
{
dp[u]=1e18;
for (auto i:anc)
{
dp[u]=min(dp[u],dp[i]+(dist[u]-dist[i])*V[u]+S[u]);
}
}
anc.push_back(u);
for (auto [i,w]:nei[u])
{
if (i==p) continue;
dist[i]=dist[u]+w;
dfs1(i,u);
}
anc.pop_back();
}
void dfs(int u,int p=-1)
{
dp[u]=query(V[u])+V[u]*dist[u]+S[u];
insert({dp[u],-dist[u]});
for (auto [i,w]:nei[u])
{
if (i==p) continue;
dist[i]=dist[u]+w;
dfs(i,u);
}
}
inline void solve()
{
int n;
cin>>n;
for (int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
nei[u].push_back({v,w});
nei[v].push_back({u,w});
}
for (int i=2;i<=n;i++)
cin>>S[i]>>V[i];
if (n<=2500)
{
dfs1(1);
for (int i=2;i<=n;i++)
cout<<dp[i]<<' ';
cout<<endl;return;
}
for (auto [i,w]:nei[1])
{
hull={};
insert({0,0});
dist[i]=w;
dfs(i,1);
}
for (int i=2;i<=n;i++)
cout<<dp[i]<<' ';
cout<<endl;
}
signed main()
{
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int t=1;
for (int i=1;i<=t;i++)
{
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |