什么ST表啊,单调栈啊都太神了。。。蒟蒻:不会哦~
于是只好使用蒟蒻专属做法:乱搞。。。
发现:当前最大的一个数一定要到最后再合并(众神犇:废话。。。)
不考虑这个最大数
若当前"最大数"在中间,则原来的一个数列变成两个。。。可知答案就是:最大数 * 2 + 两边答案和
若当前"最大数"在数列最旁边,还是只有一个数列,故答案是:最大数 + 新数列的答案
现在再倒回去看,我们发现若一个数列中相邻两个元素 A, B 有 A < B
则必定有一个时刻变成A为最大数,则ans += A
于是做法非常简单:每次只要比较相邻两个数,把大的加到答案里去即可。
1 /************************************************************** 2 Problem: 1345 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:916 ms 7 Memory:804 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 using namespace std; 14 long long ans; 15 int n; 16 17 inline int read(){ 18 int x = 0, sgn = 1; 19 char ch = getchar(); 20 while (ch < '0' || ch > '9'){ 21 if (ch == '-') sgn = -1; 22 ch = getchar(); 23 } 24 while (ch >= '0' && ch <= '9'){ 25 x = x * 10 + ch - '0'; 26 ch = getchar(); 27 } 28 return sgn * x; 29 } 30 31 int main(){ 32 n = read(); 33 int i, X, Y; 34 Y = read(); 35 for (i = 2; i <= n; ++i){ 36 X = read(); 37 ans += max(X, Y); 38 Y = X; 39 } 40 printf("%lld ", ans); 41 return 0; 42 }
(p.s. Rank 12,为毛线啊。。。已经不能再优化了的说。。。)