제출 #1337377

#제출 시각아이디문제언어결과실행 시간메모리
1337377duyanhchupapiDischarging (NOI20_discharging)C++20
20 / 100
73 ms4316 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 5, mod = 1e9 + 7;
const ll inf = 9e18;
int n, a[N], MAX;
ll ans, cur;
vector <pair <int, int>> luu;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	// freopen(".INP", "r", stdin);
	// freopen(".OUT", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	luu.emplace_back(a[1], 1);
	ans = cur = MAX = a[1];
	// cout << ans << '\n';
	for (int i = 2; i <= n; ++i) {
		if (a[i] <= MAX) ans += cur, luu.back().second++;
		else {
			MAX = a[i];		
			luu.emplace_back(a[i], 1);
			cur += a[i];
			ans += cur;
		}
		
		while ((int)luu.size() > 1) {
			int sz = luu.size();
			int li = luu[sz - 2].second;
			int lj = luu[sz - 1].second;
			int Mi = luu[sz - 2].first;
			int Mj = luu[sz - 1].first;
			if (1LL*Mj*li > 1LL*Mi*(li + lj)) break;
			luu.pop_back();
			luu.pop_back();
			luu.emplace_back(Mj, li + lj);
			ans -= 1LL*Mi*(li + lj);
			ans += 1LL*Mj*li;
			cur -= Mi;
		}
		
		// cout << ans << '\n';
	}
	
	cout << ans;		
}
#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...