제출 #936235

#제출 시각아이디문제언어결과실행 시간메모리
936235VMaksimoski008Harbingers (CEOI09_harbingers)C++14
20 / 100
150 ms26168 KiB
#include <bits/stdc++.h> #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() //#define int long long using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; const int mod = 1e9 + 7; const int LOG = 20; const int maxn = 1e5 + 5; const double eps = 1e-9; //cht for min struct CHT { struct Line { ll a, b; Line(ll x, ll y): a(x), b(y) {} ll val(ll x) { return a * x + b; } ll intersect(Line y) { return (y.b - b + a - y.a) / (a - y.a); } }; deque<pair<Line, ll> > q; void insert(ll a, ll b) { Line line(a, b); while(q.size() > 0 && q.back().second >= q.back().first.intersect(line)) q.pop_back(); if(q.empty()) { q.push_back({ line, 0 }); return ; } q.push_back({ line, q.back().first.intersect(line) }); } ll query(ll x) { while(q.size() > 1) { if(q[1].second <= x) q.pop_front(); else break; } return q.front().first.val(x); } }; int n; vector<vector<pii> > graph; pii H[maxn]; vector<int> st; ll dp[maxn], dist[maxn]; CHT cht; void dfs1(int u, int p) { dp[u] = H[u].first + H[u].second * dist[u]; //H[u].first + H[u].second * dist[u] - H[u].second * dist[id] + dp[id] for(int &id : st) dp[u] = min(dp[u], H[u].first + H[u].second * (dist[u] - dist[id]) + dp[id]); st.push_back(u); for(auto &[v, w] : graph[u]) { if(v == p) continue; dist[v] = dist[u] + w; dfs1(v, u); } st.pop_back(); } void dfs2(int u, int p) { if(u != 1) { dp[u] = H[u].first + H[u].second * dist[u] + cht.query(H[u].second); cht.insert(-dist[u], dp[u]); } for(auto &[v, w] : graph[u]) { if(v == p) continue; dist[v] = dist[u] + w; dfs2(v, u); } } int32_t main() { cin >> n; graph.resize(n+1); for(int i=1; i<=n; i++) dp[i] = 1e18; dp[1] = 0; for(int i=0; i<n-1; i++) { int a, b, w; cin >> a >> b >> w; graph[a].push_back({ b, w }); graph[b].push_back({ a, w }); } for(int i=2; i<=n; i++) cin >> H[i].first >> H[i].second; if(n <= 2500) { dfs1(1, 0); } else { cht.insert(0, 0); dfs2(1, 0); } for(int i=2; i<=n; i++) cout << dp[i] << " "; return 0; }

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

harbingers.cpp: In function 'void dfs1(int, int)':
harbingers.cpp:78:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   78 |     for(auto &[v, w] : graph[u]) {
      |               ^
harbingers.cpp: In function 'void dfs2(int, int)':
harbingers.cpp:93:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   93 |     for(auto &[v, w] : graph[u]) {
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...