Submission #867943

#TimeUsernameProblemLanguageResultExecution timeMemory
867943Saul0906Harbingers (CEOI09_harbingers)C++14
50 / 100
122 ms22244 KiB
#include <bits/stdc++.h> //#define cin in //#define cout out #define ll long long int #define pii pair<int, int> #define fi first #define se second #define endl "\n" using namespace std; const ll inf=2e18; ll dis=0; int cont=0; struct line{ ll m, b; bool ex=false; ll eval(ll x){ return (dis+m)*x+b; } bool operator==(line a)const{ return m==a.m && b==a.b && ex==a.ex; } }; struct lichao{ lichao *left=0, *right=0; ll l, r, mid; line act; lichao(ll x, ll y){ l=x; r=y; mid=(l+r)/2ll; } void insert(line nw){ if(!act.ex){ act=nw; return; } if(act.eval(mid)>nw.eval(mid)) swap(act,nw); if(l==r || act.m==nw.m) return; if(act.m<nw.m){ if(!left) left=new lichao(l,mid); left->insert(nw); }else{ if(!right) right=new lichao(mid+1ll,r); right->insert(nw); } } void erase(line nw){ if(act==nw){ act.ex=false; cont++; return; } if(act.m<nw.m && left) left->erase(nw); else if(right) right->erase(nw); } ll query(ll x){ if(r<x || x<l) return inf; //if(act.ex && act.eval(x)<0) cout<<x<<" "<<act.m<<" "<<dis<<endl; if(l==r){ if(act.ex) return act.eval(x); else return inf; } ll ans=inf; if(act.ex) ans=act.eval(x); if(left) ans=min(ans,left->query(x)); if(right) ans=min(ans,right->query(x)); return ans; } }; int n; const int lim=1e5+5; vector<pii> ady[lim]; pii harb[lim]; bool vis[lim]{}; ll dp[lim]{}; lichao cht(0,2e9); ifstream in; ofstream out; ll h=0; pii v; void dfs(int u){ //dp[0]=max(h,dp[0]); vis[u]=true; if(u>1){ dis=h; dp[u]=harb[u].fi+cht.query(harb[u].se); } dis=0; cht.insert({-h,dp[u],true}); for(auto v:ady[u]){ if(!vis[v.fi]){ h+=v.se; dfs(v.fi); h-=v.se; } } } int main(){ in.open("harbingers.in"); out.open("harbingers.out"); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int u, v; ll w; int n; cin>>n; for(int i=1; i<n; i++){ cin>>u>>v>>w; ady[u].push_back({v,w}); ady[v].push_back({u,w}); } for(int i=2; i<=n; i++){ cin>>harb[i].fi>>harb[i].se; } dfs(1); for(int i=2; i<=n; i++){ cout<<dp[i]<<" "; } }
#Verdict Execution timeMemoryGrader output
Fetching results...