Submission #1196706

#TimeUsernameProblemLanguageResultExecution timeMemory
1196706MuhammadSaramHarbingers (CEOI09_harbingers)C++20
70 / 100
243 ms131072 KiB
// Time: 06-05-2025 07:34:15 // Problem: A - Commando // Contest: Virtual Judge - Contest 3 // URL: https://vjudge.net/contest/714915#problem/A // Memory Limint: 64 MB // Time Limint: 500 ms #include <bits/stdc++.h> using namespace std; #define int long long const int M = 1e5 + 1; int s[M],ve[M],dp[M],dep[M]; vector<vector<int>> v,rem[M]; vector<pair<int,int>> nei[M]; pair<int,int> poi(int m,int c,int m1,int c1) { return {(c-c1),(m1-m)}; } bool comp(pair<int,int> p,pair<int,int> p1) { if (p.first/p.second>p1.first/p1.second) return 1; else if(p.first/p.second==p1.first/p1.second) return p.first%p.second*p1.second>p1.first%p1.second*p.second; return 0; } void add(int m,int c,int id) { while (v.size()>1) { pair<int,int> p={v[v.size()-2][0],v[v.size()-2][1]},p1={v.back()[0],v.back()[1]}; if (comp(poi(p.first,p.second,m,c),poi(p.first,p.second,p1.first,p1.second))) rem[id].push_back(v.back()),v.pop_back(); else break; } v.push_back({m,c,id}); } int get(int x) { int ans=v[0][0]*x+v[0][1]; int s=0,e=v.size(); while (s+1<e) { int mid=(s+e)/2; int val=v[mid-1][0]*x+v[mid-1][1]; int val1=v[mid][0]*x+v[mid][1]; if (val<val1) ans=max(ans,val1),s=mid; else ans=max(ans,val),e=mid; } return ans; } void dfs(int u,int p=0) { if (!p) add(0,0,1); else { dp[u]=s[u]-get(-ve[u])+dep[u]*ve[u]; add(-dep[u],-dp[u],u); } for (auto [i,d]:nei[u]) if (i!=p) dep[i]=dep[u]+d,dfs(i,u); v.pop_back(); reverse(rem[u].begin(),rem[u].end()); for (auto i:rem[u]) add(i[0],i[1],i[2]); } signed main() { ios::sync_with_stdio(0); cin.tie(NULL), cout.tie(NULL); int n; cin>>n; for (int i=1;i<n;i++) { int u,v,d; cin>>u>>v>>d; nei[u].push_back({v,d}); nei[v].push_back({u,d}); } for (int i=2;i<=n;i++) cin>>s[i]>>ve[i]; dfs(1); for (int i=2;i<=n;i++) cout<<dp[i]<<' '; cout<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...