30%的测试数据 n<=500;
50%的测试数据 n <= 20,000。
题解:单调栈。
保持栈内单调递减,加入一个数之前先判断栈顶元素是用当前元素覆盖还是top-1覆盖,注意最后栈内要留一个元素,因为题目描述是得到长度为1的序列
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define N 1000003 using namespace std; int n,m,top; long long st[N],a[N],ans; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld",&a[i]); top=0; st[0]=1e9; for (int i=1;i<=n;i++) { while(top&&a[i]>=st[top]) { if (a[i]>=st[top-1]) ans+=st[top-1],top--; else ans+=a[i],top--; } st[++top]=a[i]; } while (top>1) ans+=st[--top]; printf("%lld\n",ans); }