Submission #1193438

#TimeUsernameProblemLanguageResultExecution timeMemory
1193438loomDischarging (NOI20_discharging)C++20
100 / 100
75 ms8260 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define nl '\n'

ld xisn(pair<int,int> l1, pair<int,int> l2){
   auto [m1, c1] = l1;
   auto [m2, c2] = l2;

   return (ld)(c2 - c1)/(m1 - m2);
}

int yval(pair<int,int> l, int x){
   auto [m, c] = l;
   return m*x + c;
}

inline void solve(){
   int n;
   cin>>n;
   int a[n];
   for(int i=0; i<n; i++) cin>>a[i];

   deque<pair<int,int>> dq;
   int ldp = 0, mx = 0;
   for(int i=0; i<n; i++){
      mx = max(mx, a[i]);
      pair<int,int> cur = {i, ldp};

      while(dq.size() >= 2 and xisn(dq.back(), cur) <= xisn(dq.back(), dq[(int)dq.size()-2])) dq.pop_back();
      dq.push_back(cur);

      while(dq.size() >= 2 and yval(dq[0], mx) <= yval(dq[1], mx)) dq.pop_front();
      ldp = yval(dq[0], mx) - n*mx;
   }

   cout<<-ldp;
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(NULL);cout.tie(NULL);

   int t = 1;
   //cin>>t;
   while(t--) solve();

   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...