[BZOJ1345][Baltic2007]序列问题Sequence(单调栈)
来源:互联网 发布:sql删除语句drop 编辑:程序博客网 时间:2024/04/28 10:06
=== ===
这里放传送门
=== ===
题解
显然我们有一种很差劲的方法就是用最大的元素一个个去合并掉所有的元素,这样虽然易于操作【雾】但造成的代价会很大。。。所以应该让较小的元素尽可能地多合并其它的元素。于是维护一个单调递减的栈,如果新元素比栈顶元素小的话就直接入栈,否则就把栈顶元素合并掉。因为对于栈顶元素来说此时它左右两边第一个比它大的数字都找到了,所以它最终肯定是合并到两个数字中的一个。原因是以右边为例,只要有右边第一个比它大的数字k放在那里,再更靠右的所有数字都没有贡献了,因为如果这些数字比k大,那么肯定不如k更优;如果比k小,那么肯定并不过来会被k挡住。于是合并的时候要判断一下是往栈内倒数第二个元素合并还是往将要入栈的元素a[i]合并。最后合并所有栈内元素直到只剩下一个就可以了。
代码
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,a[1000010],st[1000010],top;long long ans;int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++){ while (top!=0&&a[i]>=st[top]){ if (st[top-1]<a[i]&&top!=1)//注意判断条件top!=1 ans+=st[top-1]; else ans+=a[i]; top--; } st[++top]=a[i]; } while (top>1){//注意这里是大于1而不是大于0,因为最后要剩下一个 ans+=st[--top]; } printf("%lld\n",ans); return 0;}
偏偏在最后出现的补充说明
感觉单调栈的问题变化形式很多啊。。还是要考虑“第一个比它大/小”的数字会产生什么影响对吧。。。。
0 0
- [BZOJ1345][Baltic2007]序列问题Sequence(单调栈)
- [BZOJ1345][Baltic2007]序列问题Sequence(单调栈)
- [BZOJ1345][Baltic2007]序列问题Sequence(单调栈)
- BZOJ1345: [Baltic2007]序列问题Sequence
- 【Baltic2007】【BZOJ1345】序列问题Sequence
- bzoj1345: [Baltic2007]序列问题Sequence
- bzoj 1345: [Baltic2007]序列问题Sequence(单调栈)
- [单调栈] BZOJ 1345 [Baltic2007]序列问题Sequence
- [BZOJ 1345][Baltic2007]序列问题Sequence:单调栈
- bzoj1345 序列问题sequence
- BZOJ 1345: [Baltic2007]序列问题Sequence
- 【BZOJ 1345】 [Baltic2007]序列问题Sequence
- 【bzoj 1345】 [Baltic2007]序列问题Sequence
- 【bzoj1345】【序列问题】【贪心】
- 【BZOJ】【P1345】【Baltic2007】【序列问题Sequence】【ST表】
- bzoj 1345: [Baltic2007]序列问题Sequence 排序+贪心
- 【BZOJ1342】【Baltic2007】Sound静音问题 单调队列
- BZOJ 1342 Baltic2007 Sound静音问题 单调队列
- java 动态编译&load
- 第12周 项目4 - 利用遍历思想求解图问题 (6-7)
- excel自动生成代码_1
- Spark MLlib特征处理:TF-IDF 词频-逆文频---原理及实战
- Android语音通话实现方案及相关技术介绍
- [BZOJ1345][Baltic2007]序列问题Sequence(单调栈)
- java时间操作函数汇总
- jboss-as-7.1.1.Final:(六)向wildfly-10.1.0.Final迁移
- AOP编程
- spark学习-核心组件
- 第十二周 项目1 -图基本算法库
- zab协议(zookeeper atomic broadcast)原子广播
- 系统稳定性---监控指标
- USB|USB2.0|UDK-CodeFlow-Simplified