点击这里查看原题
维护一个单调递减的栈,如果要加入的元素x大于栈顶元素s[top],分两种情况:
如果s[top-1]>x,ans+=x;
如果s[top-1]<=x,ans+=s[top-1]。
/*
User:Small
Language:C++
Problem No.:1345
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e6+5;
int s[M],tp,a[M],n;
ll ans;
int main(){
freopen("data.in","r",stdin);//
scanf("%d",&n);
s[0]=inf;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
while(tp&&s[tp]<=x){
ans+=(x>=s[tp-1])?s[tp-1]:x;
tp--;
}
s[++tp]=x;
}
while(tp>1) ans+=s[--tp];
printf("%lld\n",ans);
return 0;
}