【Luogu】P2422良好的感觉(单调栈)
2024-09-08 10:46:15
写代码能力需要极大提升。我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了……
首先这题需要转换自己的思维。枚举所有“最小点”,然后看它往左往右最大能扩展多少。
维护一个单调递增的序列,弹栈时就会是这种情况:
设被弹出去的元素是s,那它为什么会被弹出去呢?因为它比当前元素大。
比当前元素大说明了什么呢?说明如果有一个区间以它为最小值,那这个区间向右扩展的极限就在当前元素前面。因为区间不能继续向右扩展,一扩展,区间就包含当前元素了,那元素s就不是最小值了,而我们这个区间又是以s为最小值的区间……
所以我们分析出了区间的右端点。区间的左端点在栈顶的下面一个元素停住。推理同上。
于是一个区间枚举成功。可以把这个区间的价值和当前答案比对并更新答案。
代码如下。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; long long ans;
long long sum[];
long long que[];
int d[],t;
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%lld",&que[i]);
sum[i]=sum[i-]+que[i];
while(t&&que[d[t]]>=que[i]){
ans=max(ans,que[d[t]]*(sum[i-]-sum[d[t-]]));
t--;
}
d[++t]=i;
}
while(t){
ans=max(ans,que[d[t]]*(sum[n]-sum[d[t-]]));
t--;
}
printf("%lld",ans);
return ;
}
最新文章
- PL/SQL入门理解(一)
- JS函数节流
- [WPF实用技巧]如何使WPF的TreeView节点之间有连线
- HDU 5867 Sparse Graph (2016年大连网络赛 I bfs+补图)
- Objective-C(NSString、BOOL、多文件开发)
- 初学cocos2dx-3.x之使用Scale9Sprite时的配置问题
- 命令行工具cmder
- yii 操作session和cookie
- having count(*) >; 1
- 【开源java游戏框架libgdx专题】-01-libgdx介绍
- js:防抖动与节流
- Java使用DOM4J对XML文件进行增删改查操作
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
- 5月份值得一看的 Java 技术干货!
- C# JArray与JObject 的使用
- vue之v-model
- LightOj 1104 - Birthday Paradox(生日悖论概率)
- IDEA配置GIT
- 【文文殿下】【BZOJ4804】欧拉心算
- java原生序列化和Kryo序列化性能比较
热门文章
- css命名规范&mdash;CSS样式命名整理
- 关于软件测试(5):初识Peer Review
- tomcat配置 —— 各个目录的作用
- 粗谈Android未来前景
- JAVASCRIPT闭包以及原型链
- shell 复合条件测试 if [ $1 == ";1"; -o $1 == ";0"; ] ------==和-eq怎么用
- ndarray数组变换
- UEditor练习(JSP版)
- 智能指针之 weak_ptr
- Java 局部变量未初始化会报错,局部变量没有初始值,成员变量有初始值