Submission #370044

#TimeUsernameProblemLanguageResultExecution timeMemory
370044danielcm585Discharging (NOI20_discharging)C++14
100 / 100
179 ms11884 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second typedef long long ll; typedef pair<int,int> ii; const int N = 1e6; const ll INF = 1e18; int n, m; int a[N+2], st[N+2]; ll dp[N+2]; struct line { ll m, c; ll operator ()(ll x) { return m*x + c; } }; bool greaterFrac(ll a, ll b, ll c, ll d) { // a/b >= c/d; if (a/b != c/d) return a/b > c/d; return (a%b)*d >= (c%d)*b; } bool isBad(line a, line b, line c) { // (c1-c2)/(m2-m1) >= (c2-c3)/(m3-m2) return greaterFrac(a.c-b.c,b.m-a.m,b.c-c.c,c.m-b.m); } struct convexHull { int sz; deque<line> dq; convexHull(): sz(0) {} void insert(ll m, ll c) { line cur = {m,c}; while (sz >= 2 && isBad(dq[sz-2],dq[sz-1],cur)) { dq.pop_back(); sz--; } dq.push_back(cur); sz++; } // ll query(ll x) { // while (sz >= 2 && dq[0](x) >= dq[1](x)) { // dq.pop_front(); // sz--; // } // return dq[0](x); // } ll query(ll x) { ll ret = INF; for (int l = 0, r = sz-1; l <= r; ) { int mid = (l+r)/2; ret = min(ret,dq[mid](x)); if (mid+1 < sz && dq[mid+1](x) < dq[mid](x)) l = mid+1; else r = mid-1; } return ret; } } ch; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } reverse(a+1,a+n+1); for (int i = 1; i <= n; i++) { while (m > 0 && a[st[m]] <= a[i]) m--; st[++m] = i; } for (int i = 1; i <= m; i++) { ch.insert(a[st[i]],dp[i-1]); dp[i] = ch.query(st[i]); } cout << dp[m] << '\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...