Submission #1264510

#TimeUsernameProblemLanguageResultExecution timeMemory
1264510goulthenDischarging (NOI20_discharging)C++20
100 / 100
66 ms16244 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back

const int MAXN = 1e6 + 10;
const int INF = 1e18+10;
int a[MAXN], dp[MAXN];

int eval(int i, int x) {
	return dp[i-1] + a[i]*x;
}

double intersect(int i, int j) { 
	return (double)(dp[i-1] - dp[j-1]) / (a[j] - a[i]); 
}

int32_t main(){
	ios::sync_with_stdio(0);cin.tie(0);
	int n;cin >> n;
	rep(i,1,n) cin >> a[i];
	int mx = 0;
	rep(i,1,n) {
		mx =max(mx,a[i]);
		a[i] = mx;
	}
	reverse(a+1,a+n+1);

	deque<int> q;
	rep(i,1,n) {
		while (a[i]!=a[i-1] && q.size() > 1 && intersect(q.back(), q[q.size()-2]) >= intersect(q[q.size()-2], i)) q.pop_back();
		if (a[i]!=a[i-1]) q.push_back(i); 

		while (q.size() > 1 && intersect(q[0], q[1]) <= i) q.pop_front();
		dp[i] = eval(q.front(), 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...