Submission #335918

#TimeUsernameProblemLanguageResultExecution timeMemory
335918mihai145Discharging (NOI20_discharging)C++14
100 / 100
151 ms24556 KiB
#include <iostream> #include <deque> using namespace std; struct Line { long long m, n; long long eval(long long x) { return m * x + n; } long double intersect(Line l) { return (1.0 * (l.n - n)) / (1.0 * (m - l.m)); } }; struct CHT { deque <Line> dq; void Insert(Line l) { while((int)dq.size() > 1 && dq.end()[-1].intersect(l) < dq.end()[-2].intersect(dq.end()[-1])) dq.pop_back(); dq.push_back(l); } long long Query(long long x) { while(dq.size() > 1 && dq[0].intersect(dq[1]) < x) dq.pop_front(); return dq[0].eval(x); } }; const int NMAX = 1e6; int N; long long T[NMAX + 5], dp[NMAX + 5]; CHT cht; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> N; for(int i = 1; i <= N; i++) cin >> T[i]; dp[0] = 0; cht.Insert({-1, 0}); long long runningMax = 0; for(int i = 1; i <= N; i++) { runningMax = max(runningMax, T[i]); dp[i] = runningMax * (N + 1) + cht.Query(runningMax); cht.Insert({-(i + 1), dp[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...