제출 #6108

#제출 시각아이디문제언어결과실행 시간메모리
6108kriii즐거운 채소 기르기 (JOI14_growing)C++98
0 / 100
8 ms4756 KiB
#include <stdio.h>
#include <stack>
using namespace std;

int N,D[300030],L[300030],R[300030];
stack<pair<int, int> > S; int lf;

int main()
{
	scanf ("%d",&N);
	for (int i=0;i<N;i++) scanf ("%d",&D[i]);
	for (int i=0;i<N;i++){
		while (!S.empty() && S.top().first < D[i]){
			lf -= S.top().second;
			S.pop();
		}
		L[i] = lf;
		if (!S.empty() && S.top().first == D[i]){
			L[i] -= S.top().second;
			S.top().second++;
		}
		else S.push(make_pair(D[i],1));
		lf++;
	}
	while (!S.empty()) S.pop(); lf = 0;
	for (int i=N-1;i>=0;i--){
		while (!S.empty() && S.top().first < D[i]){
			lf -= S.top().second;
			S.pop();
		}
		R[i] = lf;
		if (!S.empty() && S.top().first == D[i]){
			R[i] -= S.top().second;
			S.top().second++;
		}
		else S.push(make_pair(D[i],1));
		lf++;
	}

	long long ans = 0;
	for (int i=0;i<N;i++) ans += L[i] < R[i] ? L[i] : R[i];

	printf ("%lld\n",ans);

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