Description
对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列。这一操作的代价是max(ai,ai+1)。进行n-1次该操作后,可以得到一个长度为1的序列。我们的任务是计算代价最小的reduce操作步骤,将给定的序列变成长度为1的序列。
Input
第一行为一个整数n( 1 <= n <= 1,000,000 ),表示给定序列的长度。接下来的n行,每行一个整数ai(0 <=ai<= 1, 000, 000, 000),为序列中的元素。
Output
只有一行,为一个整数,即将序列变成一个元素的最小代价。
Sample Input
3
1
2
3
1
2
3
Sample Output
5
HINT
30%的测试数据 n<=500;
50%的测试数据 n <= 20,000。
Source
单调栈乱搞
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=1000007;
int s[maxn];
int main(){
int n;
scanf("%d",&n);
int ll=0;
long long ans=0;
s[0]=1300000000;
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
while(ll&&s[ll]<=a){
if(a>s[ll-1]){
ans+=s[ll-1];
}
else ans+=a;ll--;
}
s[++ll]=a;
}
for(int i=1;i<ll;i++)
ans+=s[i];
printf("%lld",ans);
return 0;
}