Submission #1139881

#TimeUsernameProblemLanguageResultExecution timeMemory
1139881LeonidCukHarbingers (CEOI09_harbingers)C++20
20 / 100
208 ms131072 KiB
#include <bits/stdc++.h> using namespace std; vector<pair<int,int>>g[100000],v; long long dp[100000]; struct node { long long int a,b; node *l,*r; node(long long int a1,long long int b1) { a=a1; b=b1; l=nullptr; r=nullptr; } }; node *root[100000]; long long int najdi(node *n,long long int x) { return n->a*x+n->b; } void smeni(node *a,node *b) { swap(a->a,b->a); swap(a->b,b->b); } long long int gsum(node *n,int l,int r,long long int x) { if(l==r)return najdi(n,x); int m=(l+r)/2; if(x<=m) { if(n->l==nullptr)return najdi(n,x); else return min(najdi(n,x),gsum(n->l,l,m,x)); } else { if(n->r==nullptr)return najdi(n,x); else return min(najdi(n,x),gsum(n->r,m+1,r,x)); } } node *update(node *n,int l,int r,node *x) { node *t=new node(n->a,n->b); int m=(l+r)/2; if(t->a<x->a)smeni(x,t); if(l==r) { if(najdi(x,m)>najdi(t,m))return t; else return x; } if(najdi(x,m)>najdi(t,m)) { t->l=n->l; if(n->r==nullptr)t->r=x; else t->r=update(n->r,m+1,r,x); } else { smeni(x,t); t->r=n->r; if(n->l==nullptr)t->l=x; else t->l=update(n->l,l,m,x); } return t; } void dfs(int a,int b,long long int sum) { dp[a]=v[a].first+sum*v[a].second+gsum(root[b],0,1000000000,v[a].second); node *t=new node(-sum,dp[a]); root[a]=update(root[b],0,1000000000,t); for(auto i:g[a]) { if(i.first!=b) { dfs(i.first,a,i.second+sum); } } } int main() { int n,a,b,c; cin>>n; for(int i=0;i<n-1;i++) { cin>>a>>b>>c; g[a-1].push_back({b-1,c}); g[b-1].push_back({a-1,c}); } root[0]=new node(0LL,0LL); v.push_back({0,0}); for(int i=1;i<n;i++) { cin>>a>>b; v.push_back({a,b}); } dfs(0,0,0); for(int i=1;i<n;i++) { cout<<dp[i]<<" "; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...