#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
class ConvexHull
{
public:
deque <pair <int, int>> coada;
int evaluate (pair <int, int> crt, int x)
{
return crt.first*x+crt.second;
}
long double intersection (pair <int, int> line, pair <int, int> line1)
{
return (line1.second-line.second)/(line.first-line1.first);
}
bool isRedundant (pair <int, int> check, pair <int, int> before, pair <int, int> after)
{
return intersection (after, check)>=intersection (after, before);
}
void add (int m, int a)
{
while (coada.size()>1 && isRedundant (coada.back(), {m, a}, coada[coada.size()-2])) coada.pop_back ();
coada.push_back ({m, a});
}
int query (int x)
{
while (coada.size()>1 && evaluate (coada[0], x)>evaluate (coada[1], x))
{
coada.pop_front ();
}
return evaluate (coada[0], x);
}
};
int dp[1000005], v[1000005], n;
ConvexHull cht;
int main ()
{
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> v[i];
v[i]=max (v[i-1], v[i]);
cht.add (-i, dp[i-1]);
dp[i]=v[i]*(n+1)+cht.query (v[i]);
}
cout << dp[n];
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |