Submission #1300135

#TimeUsernameProblemLanguageResultExecution timeMemory
1300135BuzzyBeezDischarging (NOI20_discharging)C++20
100 / 100
87 ms12200 KiB
#include <bits/stdc++.h> using namespace std; const long long inf = 1e18; struct Lichao_Tree { static const int L = 0, R = 1e6; struct line { long long a, b; line() {} line(const long long& _a, const long long& _b) : a(_a), b(_b) {} long long operator () (const long long& x) {return a * x + b;} }; struct tree_node { tree_node *left = nullptr, *right = nullptr; line d = line(0, -inf); void insert(int l, int r, line nd) { int mid = (l + r) / 2; bool optl = d(l) < nd(l), optm = d(mid) < nd(mid), optr = d(r) < nd(r); if (optm) swap(d, nd); if (l == r) return; if (optl != optm) { if (!left) left = new tree_node; (*left).insert(l, mid, nd); } if (optr != optm) { if (!right) right = new tree_node; (*right).insert(mid + 1, r, nd); } } long long query(int l, int r, int x) { long long res = d(x); int mid = (l + r) / 2; if (left && x < mid) res = max(res, (*left).query(l, mid, x)); if (right && x > mid) res = max(res, (*right).query(mid + 1, r, x)); return res; } } root; void insert(const long long& a, const long long& b) {root.insert(L, R, line(-a, -b));} long long query(int x) {return -root.query(L, R, x);} } tree; int t[1000008]; long long dp[1000008]; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> t[i]; t[i] = max(t[i], t[i - 1]); } reverse(t + 1, t + n + 1); for (int i = 1; i <= n; ++i) { tree.insert(t[i], dp[i - 1]); dp[i] = tree.query(i); // cout << dp[i] << ' '; } // cout << endl; cout << dp[n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...