BZOJ1345:[Baltic2007]序列问题
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=1345
假设当前序列是单调的,那么显然答案就是从低往高合并的权值和。
假设\(a\leqslant b \leqslant c\),那么合并\(a,b\)然后合并\(b,c\)的代价是\(b+c\),显然要比合并\(b,c\)再合并\(a,c\)的代价\(c+c\)要优。
如果当前序列不单调,那么必然存在一个位置\(pos\)满足\(a[pos-1]\geqslant a[pos] \leqslant a[pos+1]\)。我们只需要把\(a[pos]\)与\(a[pos-1],a[pos+1]\)中值较小的那个合并即可。可以证明,能与\(a[pos]\)合并的最小值就是\(min(a[pos-1],a[pos+1])\),如果\(a[pos-1]\)或者\(a[pos+1]\)之前与其它数合并过,并且发生了改变,那么改变之后的数值显然是大于\(min(a[pos-1],a[pos+1])\)的。所以我们只需要维护一个单调栈,发现这种情况判断更新答案即可。最后会剩下一个单调递减的序列,我们再按照第一种情况处理就行。
时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5,inf=2e9+5;
ll ans;
int n,top;
int stk[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
int main() {
n=read();
stk[0]=inf;
for(int i=1;i<=n;i++) {
int x=read();
while(top&&stk[top]<=x)
ans+=min(stk[top-1],x),top--;
stk[++top]=x;
}
top--;
while(top)ans+=stk[top],top--;
printf("%lld\n",ans);
return 0;
}
BZOJ1345:[Baltic2007]序列问题的更多相关文章
- BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*
BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...
- [bzoj1345][Baltic2007]序列问题_单调栈
bzoj-1345 Baltic-2007 序列问题 题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai ...
- BZOJ1345: [Baltic2007]序列问题Sequence
1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 556 Solved: 274[Submi ...
- 【BZOJ1345】[Baltic2007]序列问题Sequence 贪心+单调栈
[BZOJ1345][Baltic2007]序列问题Sequence Description 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和a ...
- BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈
BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...
- BZOJ 1345: [Baltic2007]序列问题Sequence
1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1180 Solved: 633[Subm ...
- 【bzoj1345】[Baltic2007]序列问题Sequence
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1345 因为合并的花费是较大数的权值,所以每个数肯定是和附近的小数合并完后才与大数合并, ...
- 【bzoj1345】[Baltic2007]序列问题Sequence 单调栈
题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...
- [Baltic2007]序列问题Sequence
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1002 Solved: 535[Submit][Status][Discuss] Descriptio ...
随机推荐
- [note]BSGS & exBSGS
BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...
- Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像
本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...
- spark在yarn-cluster上面执行报错
在单机模式下执行成功的spark程序,在yarn上面就报错.异常信息如下: // :: INFO DAGScheduler: Completed ResultTask(, ) // :: INFO D ...
- Android UI Design
Ref:直接拿来用!10款实用Android UI工具 Ref:Android UI设计资源 Ref:Android酷炫实用的开源框架(UI框架) Ref:Android UI 组件 Ref:Andr ...
- 深入理解ByteBuffer(转)
转:http://blog.csdn.net/workformywork/article/details/26699345?utm_source=tuicool&utm_medium=refe ...
- windows10 Python2和Python3共存
通过配置环境变量,达到使用python命令启动python2,使用python3命令启动python3,pip启动pip2, pip3启动pip3的目的,互不影响. 1.安装python2.7 安装 ...
- oldboyshell编程扩展内容
oldboyshell编程扩展内容一.命令的优先级 命令分为: ==> alias ==> Compound Commands ==> function ==> build_ ...
- Data Structure Graph: cycle in a directed graph
geeks上的解答复杂了些,用回溯就行了 #include <iostream> #include <vector> #include <algorithm> #i ...
- HTTP请求解析--从一个请求开始
先来看看一个http请求实例 请求行: POST /chapter17/user.html HTTP/1.1 请求头: Accept: application/json, text/javascrip ...
- web框架之Django<一、初识>
一.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...