题目传送门
。
解法:
只有我写的是单调栈吗?
维护一个单调递减的栈。
那么每次进来一个元素x
如果大于栈顶的话。说明栈顶要被消除了。
栈顶与栈顶下一个可以认为是挨在一起的。
x与栈顶可以认为是挨在一起的。
所以比较x与栈顶下一个的大小加到答案里即可。
跑完一遍之后可能栈还有元素没消除完。
从栈顶往下慢慢消就行。
代码实现:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
int sta[1100000],top,a[1100000];
int main() {
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int top=0;ll ans=0;
for(int i=1;i<=n;i++) {
int x=a[i];
while(x>=sta[top]&&top>0) {
if(top==1)ans+=ll(a[i]);
else ans+=min(sta[top-1],x);top--;
}sta[++top]=x;
}
for(int i=1;i<top;i++) ans+=ll(sta[i]);
printf("%lld\n",ans);
return 0;
}