BZOJ 1345: [Baltic2007]序列問題Sequence 單調棧。、
阿新 • • 發佈:2018-11-27
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
思路。
維護一個單調遞減的棧。
emmmmmm
#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int a[N],h[N],n; long long ans; int main(){ scanf("%d",&n); for (int i = 0; i < n; i++) scanf("%d",&a[i]); int t = 0; for (int i = 0; i < n; i++){ while(t != 0 && h[t] <= a[i]){ if (t != 1 && h[t-1] < a[i]) ans += h[t-1]; else ans += a[i]; t--; } h[++t] = a[i]; } while(t > 1) ans += h[--t]; printf("%lld\n",ans); return 0; }