Submission #1354340

#TimeUsernameProblemLanguageResultExecution timeMemory
1354340Jawad_Akbar_JJDischarging (NOI20_discharging)C++20
100 / 100
198 ms39576 KiB
#include <iostream>
#include <deque>

using namespace std;
#define int long long
const int N = 1<<20;
int dp[N], a[N], p[N], c[N], m[N];

int intersection(int i, int j){
	if (m[i] == m[j]){
		if (c[i] < c[j])
			return N;
		return -1e9;
	}
	int A = c[j] - c[i], B = m[i] - m[j];
	// cout<<A<<','<<B<<' ';
	return A / B + (A % B != 0 and ((A < 0) ^ (B < 0)) == 0);
}

signed main(){
	int n;
	cin>>n;

	for (int i=1;i<=n;i++){
		cin>>a[i];
		p[i] = p[i-1];
		if (a[i] >= a[p[i-1]])
			p[i] = i;
		m[i] = -a[p[i]];
	}

	c[p[n]] = n * a[p[n]];
	m[p[n]] = -a[p[n]];
	deque<int> v = {p[n]}, en = {n + 1};

	for (int i=p[n]-1;i + 1;i--){
		while (v.size() > 1 and en[1] > i)
			v.pop_front(), en.pop_front();
		dp[i] = dp[v[0]] + a[p[v[0]]] * (n - i);
		c[i] = dp[i] + a[p[i]] * n;

		if (i == 0)
			break;
		while (v.size() > 0 and intersection(i, v.back()) >= en.back())
			v.pop_back(), en.pop_back();
		if (v.size() == 0)
			v = {i}, en = {n+1};
		else if (intersection(i, v.back()) != -1e9){
			en.push_back(intersection(i, v.back()));
			v.push_back(i);
		}
	}
	cout<<dp[0]<<endl;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...