Submission #1290332

#TimeUsernameProblemLanguageResultExecution timeMemory
1290332icebearHarbingers (CEOI09_harbingers)C++20
100 / 100
88 ms22664 KiB
// ~~ icebear ~~ #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> ii; typedef pair<int, ii> iii; template<class T> bool minimize(T &a, const T &b) { if (a > b) return a = b, true; return false; } template<class T> bool maximize(T &a, const T &b) { if (a < b) return a = b, true; return false; } #define FOR(i,a,b) for(int i=(a); i<=(b); ++i) #define FORR(i,a,b) for(int i=(a); i>=(b); --i) #define REP(i, n) for(int i=0; i<(n); ++i) #define RED(i, n) for(int i=(n)-1; i>=0; --i) #define MASK(i) (1LL << (i)) #define BIT(S, i) (((S) >> (i)) & 1) #define mp make_pair #define pb push_back #define fi first #define se second #define all(x) x.begin(), x.end() #define task "icebear" /*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */ const int MOD = 1e9 + 7; const int inf = 1e9 + 27092008; const ll INF = 1e18 + 27092008; const int N = 2e5 + 5; int numNode, par[N], S[N], V[N]; ll d[N], f[N]; vector<ii> G[N]; struct Line { ll a, b; Line (ll _a = 0, ll _b = 0): a(_a), b(_b) {} ll eval(ll x) {return a * x + b;} Line operator - (const Line &other) { return Line(a - other.a, b - other.b); } }; bool useless(Line l1, Line l2, Line l3) { l3 = l3 - l1; l2 = l2 - l1; return (__int128)l2.a * l3.b - (__int128)l3.a * l2.b >= 0; } Line L[N]; int num; ll query(ll x) { int l = 0, r = num - 1; while(l < r) { int mid = (l + r + 1) / 2; if (L[mid-1].eval(x) >= L[mid].eval(x)) l = mid; else r = mid - 1; } return L[l].eval(x); } int ins(Line li) { if (num < 2 || !useless(L[num-2], L[num-1], li)) return num; int l = 1, r = num - 1; while(l < r) { int mid = (l + r) >> 1; if (useless(L[mid-1], L[mid], li)) r = mid; else l = mid + 1; } return l; } void dfs(int u) { f[u] = S[u] + 1LL * d[u] * V[u] + query(V[u]); Line li = Line(-d[u], f[u]); int prv_pos = ins(li), prv_sz = num; Line prv_li = L[prv_pos]; L[prv_pos] = li; num = prv_pos + 1; for(ii v : G[u]) if (v.fi != par[u]) { par[v.fi] = u; d[v.fi] = d[u] + v.se; dfs(v.fi); } num = prv_sz; L[prv_pos] = prv_li; } void init(void) { cin >> numNode; FOR(i, 2, numNode) { int u, v, c; cin >> u >> v >> c; G[u].pb(mp(v, c)); G[v].pb(mp(u, c)); } FOR(i, 2, numNode) cin >> S[i] >> V[i]; } void process(void) { memset(f, 0x3f, sizeof f); f[1] = 0; dfs(1); FOR(i, 2, numNode) cout << f[i] << ' '; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } int tc = 1; // cin >> tc; while(tc--) { init(); process(); } return 0; }

Compilation message (stderr)

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