bzoj1345 序列問題sequence

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

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章