题目链接:Codeforces - Artem and Array
可以发现,如果某一个数字两边都是比他大的数字,那么这个数字是一定可以删除,并且最优。
然后可以用栈来维护删除的操作。
最后的序列除了最大值和次大值,都是可以获得的。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int a[N],n,res,top,s[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
while(top>=2){
if(s[top]<=s[top-1]&&a[i]>=s[top]) res+=min(s[--top],a[i]);
else break;
}
s[++top]=a[i];
}
sort(s+1,s+1+top);
for(int i=1;i<top-1;i++) res+=s[i];
cout<<res;
return 0;
}