Submission #337612

#TimeUsernameProblemLanguageResultExecution timeMemory
337612ncduy0303Discharging (NOI20_discharging)C++17
100 / 100
156 ms18656 KiB
#include <bits/stdc++.h> using namespace std; #define ar array #define ll long long const int MAX_N = 1e5 + 1; const ll MOD = 1e9 + 7; const ll INF = 1e9; struct convexhull { struct line { ll m, c; line(ll m, ll c): m(m), c(c) {} ll operator()(ll x) {return m * x + c;} }; deque<line> dq; bool bad(line a, line b, line c) { return 1.0 * (c.c - a.c) / (a.m - c.m) <= 1.0 * (b.c - a.c) / (a.m - b.m); } void add(line l) { while(dq.size() > 1 && bad(dq[(int)dq.size() - 2], dq.back(), l)) dq.pop_back(); dq.emplace_back(l); } long query(long x) { if(dq.empty()) return 1e18; int l = 0, r = (int)dq.size() - 1; while(l < r) { int mid = (l + r) >> 1; if(dq[mid](x) >= dq[mid + 1](x)) l = mid + 1; else r = mid; } return dq[r](x); } }; void solve() { int n; cin >> n; vector<int> a(n + 1); for (int i = n; i > 0; i--) cin >> a[i]; vector<int> st; for (int i = 1; i <= n; i++) { while (st.size() && a[st.back()] <= a[i]) st.pop_back(); st.push_back(i); } int m = st.size(); vector<ll> dp(m + 1); convexhull cht; for (int i = 1; i <= m; i++) { cht.add({a[st[i - 1]], dp[i - 1]}); dp[i] = cht.query(st[i - 1]); } cout << dp[m] << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tc = 1; // cin >> tc; for (int t = 1; t <= tc; t++) { // cout << "Case #" << t << ": "; solve(); } }
#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...