제출 #1123885

#제출 시각아이디문제언어결과실행 시간메모리
1123885lftroqHarbingers (CEOI09_harbingers)C++20
100 / 100
97 ms23224 KiB
#include<bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef pair<ll,ll> pii; const ll INF=1e15; const ll N=1e5+5; struct line { ll a,b; line() {a=b=0;} line(ll _a,ll _b) { a=_a; b=_b; } ll val(ll x){return a*x+b;} }; double inter(line a,line b) { return (1.0*(b.b-a.b))/(1.0*(a.a-b.a)); } ll n,cn; line lines[N]; vector<pair<pii,line>> liem; vector<pii> graph[N]; ll h[N],s[N],v[N]; ll dp[N]; void addline(line f) { ll l=1,r=cn-1,temp=cn; while(l<=r) { ll mid=(l+r)>>1; if(inter(lines[mid],lines[mid-1])>=inter(lines[mid],f)) { temp=mid; r=mid-1; } else l=mid+1; } liem.push_back({{temp,cn},lines[temp]}); cn=temp+1; lines[temp]=f; } void rollback() { lines[liem.back().fi.fi]=liem.back().se; cn=liem.back().fi.se; liem.pop_back(); } ll get(ll x) { ll l=1,r=cn-1,temp=0; while(l<=r) { ll mid=(l+r)>>1; if(inter(lines[mid],lines[mid-1])<x) { temp=mid; l=mid+1; } else r=mid-1; } return lines[temp].val(x); } void dfs_init(ll u,ll p) { for(ll i=0;i<(ll)graph[u].size();i++) { ll v=graph[u][i].fi,w=graph[u][i].se; if(v==p) continue; h[v]=h[u]+w; dfs_init(v,u); } } void dfs(ll u,ll p) { //cout << u << ' ' << p << ' ' << cn << ":" << endl; //for(ll i=1;i<=cn;i++) cout << lines[i].a << ' ' << lines[i].b << endl; //cout << "===" << endl; if(u!=1) dp[u]=get(v[u])+1ll*h[u]*v[u]+s[u]; addline(line(-h[u],dp[u])); for(ll i=0;i<(ll)graph[u].size();i++) { ll v=graph[u][i].fi; if(v==p) continue; dfs(v,u); } rollback(); } void solve() { cin >> n; for(ll i=1;i<n;i++) { ll u,v,w; cin >> u >> v >> w; graph[u].push_back({v,w}); graph[v].push_back({u,w}); } for(ll i=2;i<=n;i++) cin >> s[i] >> v[i]; dfs_init(1,1); dfs(1,1); for(ll i=2;i<=n;i++) cout << dp[i] << ' '; cout << endl; } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); if(fopen("lftroq.inp","r")) { freopen("lftroq.inp","r",stdin); freopen("lftroq.out","w",stdout); } solve(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

harbingers.cpp: In function 'int main()':
harbingers.cpp:125:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |         freopen("lftroq.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:126:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  126 |         freopen("lftroq.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...