[Baltic2007]序列问题Sequence

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 1002  Solved: 535
[Submit][Status][Discuss]

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。

思路

我可能写的比较(非常)麻烦;

我先排了个序,然后在原序列(链表存的)中从小到大开始操作,每次把一个数与它两边中较大一个合并;

代码实现

 1 #include<cstdio>
 2 #include<algorithm>
 3 const int maxn=1e6+10;
 4 inline int min_(int x,int y){return x<y?x:y;}
 5 int n;
 6 long long ans;
 7 struct lili{int p,s,q;}s[maxn];
 8 struct nate{int s,ip;}f[maxn];
 9 bool comp(nate x,nate y){return x.s<y.s;}
10 int main(){
11     scanf("%d",&n);
12     s[0].s=s[n+1].s=1e9+7;
13     for(int i=1;i<=n;i++){
14         scanf("%d",&s[i].s);
15         s[i].p=i-1,s[i].q=i+1;
16         f[i].s=s[i].s,f[i].ip=i;
17     }
18     std::sort(f+1,f+n+1,comp);
19     int now,np,nq;
20     for(int i=1;i<n;i++){
21         now=f[i].ip,np=s[now].p,nq=s[now].q;
22         ans+=min_(s[np].s,s[nq].s);
23         s[np].q=nq,s[nq].p=np;
24     }
25     printf("%lld\n",ans);
26     return 0;
27 }
时间: 2024-10-10 08:02:54

[Baltic2007]序列问题Sequence的相关文章

【BZOJ1345】[Baltic2007]序列问题Sequence 贪心+单调栈

[BZOJ1345][Baltic2007]序列问题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

bzoj1345[Baltic2007]序列问题Sequence*

bzoj1345[Baltic2007]序列问题Sequence 题意: n个数,合并ai和ai+1可以得到max(ai,ai+1),代价为max(ai,ai+1).问合并n-1次最小代价为多少.n≤1000000. 题解: (来自题解,因为我不知道为什么这样做)维护一个单调递减栈.对于每个加入的元素,若加入后不满足单调性质,则让其与栈顶-1的元素比较:如果加入的数大,则合并栈顶和栈顶-1的数(把栈顶去掉),费用为栈顶-1:否则合并当前与栈顶的数(把栈顶去掉),费用为当前数.重复上述操作,直到满

【BZOJ 1345】 [Baltic2007]序列问题Sequence

1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 618  Solved: 307 [Submit][Status][Discuss] Description 对于一个给定的序列a1, -, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一操作的代价是max(ai,ai+1).进行

单调栈 BZOJ1345 [Baltic2007]序列问题Sequence

1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 899  Solved: 471[Submit][Status][Discuss] Description 对于一个给定的序列a1, -, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一操作的代价是max(ai,ai+1).进行n-

【bzoj1345】[Baltic2007]序列问题Sequence 单调栈

题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一操作的代价是max(ai,ai+1).进行n-1次该操作后,可以得到一个长度为1的序列.我们的任务是计算代价最小的reduce操作步骤,将给定的序列变成长度为1的序列. 输入 第一行为一个整数n( 1 <= n <= 1,000,000 ),表示给定序列的长度.接下来的n行,每行一个整数ai(0

UML之序列图(Sequence Diagram)

类图描述的是类之间的静态关系,而序列图展示的是对象之间的沟通方法,描述运行时的交互关系. OOP编程语言里面合理的直接交互方式只有一种,方法调用(Event通讯是间接的).所以序列图也可以 理解为方法调用交互图.方法调用有四个元素,参与者(两个,调用者和被调用者),方法名称,输入 和输出. 参与者 参与者用一个Lifeline来表示,图像为一个矩形外加底部的一条竖线.矩形里面显示对象名,格式为 name:ClassType的样式,都为可选项,Martin Fowler推荐a Handler的格式

Oracle修改序列(Sequence)起始值的方法

Oracle修改序列(Sequence)起始值的方法 Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改:alter sequence sequencename start with xxxxxxxx.但是,在Oracle DB中,修改序列没有这样的语法.下面介绍几种修改方式: 1.先删除序列,然后重新创建.不过这不是当前要讲的重点.这个方法比较暴

【转】Python数据类型之“文本序列(Text Sequence)”

[转]Python数据类型之“文本序列(Text Sequence)” Python中的文本序列类型 Python中的文本数据由str对象或字符串进行处理. 1.字符串 字符串是Unicode码值的不可变序列.字符串字面量有多种形式: 单引号:'允许嵌入"双"引号' 双引号:"允许嵌入'单'引号" 三引号:'''三个单引号''', """三个双引号""" 说明: a) 三引号的字符串可以跨越多行,所关联的空

MySQL实现序列(Sequence)效果

MySQL实现序列效果 一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长.开始索引.是否循环等,最重要的是一张表只能由一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值. 1. 新建序列表 drop table if exists sequence;   crea