您的位置:首页 > 产品设计 > UI/UE

BZOJ1345 [Baltic2007]序列问题Sequence

2014-11-06 15:20 253 查看
什么ST表啊,单调栈啊都太神了。。。蒟蒻:不会哦~

于是只好使用蒟蒻专属做法:乱搞。。。

发现:当前最大的一个数一定要到最后再合并(众神犇:废话。。。)

不考虑这个最大数

若当前"最大数"在中间,则原来的一个数列变成两个。。。可知答案就是:最大数 * 2 + 两边答案和

若当前"最大数"在数列最旁边,还是只有一个数列,故答案是:最大数 + 新数列的答案

现在再倒回去看,我们发现若一个数列中相邻两个元素 A, B 有 A < B

则必定有一个时刻变成A为最大数,则ans += A

于是做法非常简单:每次只要比较相邻两个数,把大的加到答案里去即可。

/**************************************************************
Problem: 1345
User: rausen
Language: C++
Result: Accepted
Time:916 ms
Memory:804 kb
****************************************************************/

#include <cstdio>
#include <algorithm>

using namespace std;
long long ans;
int n;

inline int read(){
int x = 0, sgn = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-') sgn = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return sgn * x;
}

int main(){
n = read();
int i, X, Y;
Y = read();
for (i = 2; i <= n; ++i){
X = read();
ans += max(X, Y);
Y = X;
}
printf("%lld\n", ans);
return 0;
}


View Code
(p.s. Rank 12,为毛线啊。。。已经不能再优化了的说。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: