Submission #575196

#TimeUsernameProblemLanguageResultExecution timeMemory
575196JovanBDischarging (NOI20_discharging)C++17
100 / 100
472 ms319876 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; const int N = 1000000; const ll INF = 1000000000000000000LL; ll a[N+5]; ll dp[N+5]; struct line{ ll k, n; ll eval(int x){ return k*x + n; } } seg[4*N+5]; ll query(int node, int l, int r, int i){ ll g = seg[node].eval(i); if(l == r) return g; int mid = (l+r)/2; if(i <= mid) return min(g, query(node*2, l, mid, i)); return min(g, query(node*2+1, mid+1, r, i)); } stack <tuple <line, int, int>> rev; void brisi(int i){ while(!rev.empty() && get<2>(rev.top()) == i){ seg[get<1>(rev.top())] = get<0>(rev.top()); rev.pop(); } } void upd(int node, int l, int r, line g, int i){ int mid = (l+r)/2; if(g.eval(mid) < seg[node].eval(mid)){ rev.push({seg[node], node, i}); swap(g, seg[node]); } if(l == r) return; if(seg[node].eval(l) > g.eval(l)) upd(node*2, l, mid, g, i); else upd(node*2+1, mid+1, r, g, i); } int main(){ ios_base::sync_with_stdio(false), cin.tie(0); cout.precision(10); cout << fixed; int n; cin >> n; for(int i=1; i<=n; i++){ cin >> a[i]; } reverse(a+1, a+1+n); for(int i=1; i<=4*n; i++) seg[i].n = INF; stack <int> st; for(int i=1; i<=n; i++){ while(!st.empty() && a[st.top()] <= a[i]){ brisi(st.top()); st.pop(); } line h; h.k = a[i]; h.n = 0; if(!st.empty()){ h.n = dp[st.top()]; } upd(1, 1, n, h, i); st.push(i); dp[i] = query(1, 1, n, i); } cout << dp[n] << "\n"; return 0; }
#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...