Submission #697510

#TimeUsernameProblemLanguageResultExecution timeMemory
697510BobonbushDischarging (NOI20_discharging)C++17
72 / 100
114 ms32200 KiB
#include <bits/stdc++.h> #define foreach for #define in : using namespace std; typedef long long ll ; const int LOG = 18; const long long base = 31; const long long MODULO = 1e9+7; const long long INF = 1e18+1; template<class X ,class Y> bool Minimize(X &x , Y y) { if(x > y) { x = y; return true; } return false; } template<class X , class Y> bool Maximize(X &x , Y y) { if(x < y) { x = y; return true; } return false; } struct lines { ll a ,b; lines(ll _a , ll _b ) { a = _a; b = _b; } ll eval(ll x) { return a *x + b; } }; deque<lines>adu; bool bad(lines &l1 , lines &l2 ,lines &l3) { return (l3.b - l1.b) * (l1.a - l2.a) < (l2.b - l1.b) * (l1.a - l3.a); } void Add(lines x) { while((int)adu.size() >= 2 && bad( adu[(int)adu.size()-2] , adu[(int)adu.size()-1] , x )) { adu.pop_back(); } adu.push_back(x); } ll Get(ll x) { while((int)adu.size() >= 2 && adu[0].eval(x) >= adu[1].eval(x) )adu.pop_front(); return adu[0].eval(x); } const int N = 1e6+1; int n , a[N]; int _next[N]; long long dp[N]; void Input() { cin >> n ; for(int i = 1; i <= n ; i++) { cin >> a[i]; if(a[_next[i-1]] <= a[i])_next[i] = i; else _next[i] = _next[i-1]; } } void Process() { Add(lines(0 , 0)); for(int i =1 ; i <= n ; i++) { if(_next[i] != i)dp[i] = dp[i-1]; else dp[i] = Get(a[i]) + n *1LL * a[i]; Add(lines( -i * 1LL , dp[i] )); } cout << dp[n]; } int main() { ios_base :: sync_with_stdio(0);cin.tie(0); int test = 1; while(test--) { Input(); Process(); } 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...