제출 #869144

#제출 시각아이디문제언어결과실행 시간메모리
869144sleepntsheepHarbingers (CEOI09_harbingers)C++17
0 / 100
116 ms21556 KiB
#include <cstdio> #include <stack> #include <cstring> #include <cassert> #include <string> #include <deque> #include <vector> #include <map> #include <queue> #include <algorithm> #include <iostream> #include <utility> using namespace std; using ll = long long; using ld = long double; #define ShinLena cin.tie(nullptr)->sync_with_stdio(false) #define N 100005 #define ALL(x) x.begin(), x.end() struct line { ll m, c; line(ll m, ll c) : m(m), c(c) {} line() : m(0), c(0) {} inline ll operator[](ll x) { return m*x+c; } inline ll intersect(line &l) { return (ld)(c-l.c)/(l.m-m); } }; int n, s[N], v[N]; ll rt[N], dp[N]; vector<pair<int, int>> g[N]; line cht[N]; int sz; inline int add(line k) { if (sz == 1 || sz > 1 && cht[sz].intersect(cht[sz-1]) < cht[sz-1].intersect(k)) return sz+1; int l = 2, r = sz, z = -1; for (; l <= r;) { int m = (l+r)/2; if (cht[m].m == k.m && cht[m].c <= k.c) z = m, l = m + 1; else if (cht[m].m == k.m && cht[m].c > k.c) return -1; else if (cht[m].intersect(cht[m-1]) > cht[m-1].intersect(k)) z = m, l = m + 1; else r = m - 1; } return z; } inline ll qry(ll x) { int l = 0, r = sz - 1, z = sz; for (;l <= r;) { int m = (l+r)/2; if (cht[m].intersect(cht[m+1]) < x) l=m+1; else r=m-1, z = m; } return cht[z][x]; } void dfs(int u, int p) { int psz = sz; dp[u] = s[u] + 1ll*v[u]*rt[u] - qry(v[u]); dp[1] = 0; int at = add(line{rt[u], -dp[u]}); line overwrote = cht[at]; if (at != -1) cht[at] = line{rt[u], -dp[u]}, sz = at; for (auto [w, v] : g[u]) if (v != p) rt[v] = rt[u] + w, dfs(v, u); if (at != -1) { sz = psz; cht[at] = overwrote; } } int main() { cht[sz=1] = {0, 0}; ShinLena; cin >> n; for (int u, v, w, i = 1; i < n; ++i) cin >> u >> v >> w, g[u].emplace_back(w, v), g[v].emplace_back(w, u); for (int i = 2; i <= n; ++i) cin >> s[i] >> v[i]; dfs(1, 1); for (int i = 2; i <= n; ++i) cout << dp[i] << ' '; return 0; }

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

harbingers.cpp: In function 'int add(line)':
harbingers.cpp:37:27: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   37 |     if (sz == 1 || sz > 1 && cht[sz].intersect(cht[sz-1]) < cht[sz-1].intersect(k)) return sz+1;
      |                    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...