题意:

给你一个序列,长度为n。你需要进行n - 1次操作,每次合并两个相邻的数,代价是max,合并后成为max,求最小代价。

n <= 1e6

解:

有个显然的做法是nlogn的,显然不行...

要搞个O(n)的算法,显然是贪心。

然而想不出来...

主要有两种思路。

①合并成一颗树。从根向下考虑。

根的贡献就是他的子节点数。

然后问题递归。

我们还可以证明有一种最优解,每个位置的数至多被合并2次。

那么就是一颗大根堆。

也可以说:若一个数的旁边比他小,那么一定会有一次合并过来,贡献为他自己。

所以做法就是:每个数的贡献是他两边比他小的个数。

②由于每次要合并小的,就开个单调栈,下面大。

每次出栈时合并,最后再合并栈中的数即可。


记得开long long

 #include <cstdio>
#include <algorithm>
typedef long long LL;
const int N = ; int a[N]; int main() {
int n;
scanf("%d", &n);
if(n == ) {
scanf("%d", &a[]);
printf("");
return ;
}
if(n == ) {
scanf("%d%d", &a[], &a[]);
printf("%d", std::max(a[], a[]));
return ;
}
scanf("%d%d", &a[], &a[]);
LL ans = ;
if(a[] > a[]) {
ans += a[];
}
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
if(a[i - ] > a[i - ]) {
ans += a[i - ];
}
if(a[i - ] > a[i]) {
ans += a[i - ];
}
}
if(a[n] > a[n - ]) {
ans += a[n];
}
printf("%lld", ans);
return ;
}

AC代码

bzoj1345 序列问题的更多相关文章

  1. bzoj1345 序列问题 (贪心)

    考虑某个点产生的贡献: 如果i左边是一个比它小的数x,那有两种情况: 1.x的左边的数y大于i,肯定要把x合并到i,i的贡献++ 2.x的左边的数y小于i,那肯定要把x合并到y,而这时候递归地来考虑, ...

  2. BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*

    BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...

  3. 【bzoj1345】[Baltic2007]序列问题Sequence

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1345 因为合并的花费是较大数的权值,所以每个数肯定是和附近的小数合并完后才与大数合并, ...

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

    [BZOJ1345][Baltic2007]序列问题Sequence Description 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和a ...

  5. [bzoj1345][Baltic2007]序列问题_单调栈

    bzoj-1345 Baltic-2007 序列问题 题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai ...

  6. BZOJ1345: [Baltic2007]序列问题Sequence

    1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 556  Solved: 274[Submi ...

  7. [BOI2007]Sequence 序列问题 BZOJ1345

    题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...

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

    题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...

  9. BZOJ1345:[Baltic2007]序列问题

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)

    继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装:kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)kvm虚拟化管理平台WebVirtMgr部署-完 ...

  2. 太白教你学python---博客分类目录

    太白非技术类随笔(持续更新中...猛击这里!!!) python基础 python基础一 pytcharm安装详细教程 python基础二 python基础数据类型 Python最详细,最深入的代码块 ...

  3. 12.18 Daily Scrum

    最近大家确实都很忙,所以所有功能的实现要等到下周.   Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             ...

  4. git常用命令点击查看

    创建git项目仓库 $git init 配置个人登记信息,这样团队协作的时候,就可以看到哪个用户修改过哪些文件的 $git config --global user.name 'cfanbo' $gi ...

  5. CentOS7.3安装rz、sz命令

    安装命令: yum install lrzsz 关于rz.sz: lrzsz是一款在linux里可代替ftp上传和下载的程序.lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议. ...

  6. Java基础知识中的注意事项

    设置Java的相关路径,举例: JAVA_HOME  -->   C:\Program Files\Java\jdk1.8.0_191 Path --->   C:\Program Fil ...

  7. FileUtils功能概述

    https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.ht ...

  8. Java singleton 一例

    org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of ...

  9. Smarty 变量修饰器

    为了更方便的实现 功能与显示分离,通常会用 smarty 将功能代码中的数据 assign 到页面中,在页面中合理使用 smarty 的修饰方法,会使页面显示更美观! 一个数据可同时使用多个修饰函数, ...

  10. FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)

    http://acm.fzu.edu.cn/contest/list.php?cid=152 主要是a题, lucas定理, 就这一版能过..  记录一下代码, 另外两个最短路  一个模拟,没什么记录 ...