///0-0 : what is your motivation, quan606303?
///quan606303 : Hutao
/*idea :
*/
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define INTMAX INT_MAX
#define INTMIN INT_MIN
#define LONGMAX LLONG_MAX
#define LONGMIN LLONG_MIN
#define fi first
#define se second
#define memfull(a,b) memset(a,b,sizeof(a));
#define endl '\n'
#define file(a) freopen(a".inp","r",stdin); freopen(a".out","w",stdout);
using namespace std;
const int MOD=1e9+7;
const int maxn=100000+7;
vector<pair<int,int> > adj[maxn];
struct point
{
int a, b;
};
int eva(point a,int x)
{
return a.a*x+a.b;
}
bool bad(point l1,point l2,point l3)
{
return (((double)(l2.b-l1.b)/(l1.a-l2.a))>=((double)(l3.b-l1.b)/(l1.a-l3.a)));
}
point line[maxn];
int top=0;
int n,s[maxn],v[maxn];
struct operation
{
int pos,top;
point overwrite;
};
stack<operation> st;
void add_line(point x)
{
int l=2,r=top,k=top+1;
while (l<=r)
{
int mid=(l+r)/2;
if (bad(line[mid-1],line[mid],x))
{
k=mid;
r=mid-1;
}
else l=mid+1;
}
st.push({k,top,line[k]});
top=k;
line[k]=x;
}
void udon()
{
operation ope=st.top();
st.pop();
top=ope.top;
line[ope.pos]=ope.overwrite;
}
int get_min(int x)
{
int l=1,r=top-1,ans=eva(line[top],x);
while (l<=r)
{
int mid=(l+r)/2;
int cnt1=eva(line[mid],x);
int cnt2=eva(line[mid+1],x);
if (cnt1<cnt2)
{
ans=min(ans,cnt1);
r=mid-1;
}
else l=mid+1;
}
return ans;
}
int d[maxn],dp[maxn];
void dfs(int u,int p)
{
if (u>1)dp[u]=get_min(v[u])+d[u]*v[u]+s[u];
add_line({-d[u],dp[u]});
for (auto v:adj[u])
{
if (v.fi==p)continue;
d[v.fi]=d[u]+v.se;
dfs(v.fi,u);
}
udon();
}
int32_t main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//file("plinhhhh");
cin>>n;
for (int i=1;i<n;i++)
{
int x,y,w;
cin>>x>>y>>w;
adj[x].push_back({y,w});
adj[y].push_back({x,w});
}
for (int i=2;i<=n;i++)cin>>s[i]>>v[i];
dfs(1,0);
for (int i=2;i<=n;i++)cout<<dp[i]<<" ";
return 0;
}
/*
3
3
2 1 3
5
1 2 2 1 4
6
1 2 3 6 5 4
*/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |