Luogu2422 | 良好的感觉 (单调栈)
题目描述
kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?
输入格式
第一行为N,代表数据记录的天数
第二行N个整数,代表每一天的感受值
输出格式
一行,表示在最舒适的一段时间中的感受值。
输入输出样例
输入 #1
6
3 1 6 4 5 2
输出 #1
60
————————————————————————————————————————————
在考第十八次CSP认证之前想找几道单调队列和单调栈的题来复习下这两个算法(估计CCF也不会给CSP认证出这样的题。
本题不难得出暴力 $ O(n^2) $ 的做法,可以使用ST表或者前缀和预处理后枚举区间起点和终点来计算每个区间的权值并取其最大值为答案,但是这样只能通过70%的数据。
另外还有一种复杂度不变的做法就是考虑对于某天的感受值 $ Ai $ 为所求区间的最小值,我们需要使用两个代表左右边界的变量以 $ i $ 为起点扩展这个区间,直到前方值为一个严格小于 $ Ai $ 的值便停止,由于本题中每个感受值都是正数,我们可以不难证明这种做法的正确性:在区间最小值和其位置确定的的情况下,覆盖的正数区间越大,得出的答案越大。同样,由于需要枚举每一个感受值为某区间的最小值,所以限于算法复杂度无法通过这道题。
所以我们可以考虑一种利用单调栈的优化做法,考虑到我们仅仅关心某个感受值为最小值适在其左右端第一个严格小于区间最小值的值所在的位置,所以我们可以用一个严格单调递增的栈(栈顶最大)来维护这种关系。在某个感受值 $ Ai $ 被确定为最小值并准备入栈时,我们应该从栈顶开始弹出每一个不小于 $ Ai $ 的值(在记录栈内每个值的同时记录该值的位置),并将这些被弹出的值的位置的 $ Rig $ 数组标记为 $ i $,以表示 $ Ai $ 是它们右边的第一个小于它的数。将弹出后得到的栈顶的数 $ Aj $ 即为 $ i $ 左边第一个小于它的数,将 $ Rig[i] $ 标记为 $ j $ ,由单调栈的性质可知对于 $ lef $ 和 $ rig $ 数组的处理是准确的。
代码如下:
#include <bits/stdc++.h>
#define ll long long
#define MAXN 100007
using namespace std;
struct Point { int id,num; }sta[MAXN];
int n,tot; ll ans,sum[MAXN];
int a[MAXN],lef[MAXN],rig[MAXN];
inline int read() {
int w=0,X=0; char ch=0;
while (!isdigit(ch)) w|=ch=='-',ch=getchar();
while (isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
int main() {
n=read();
for (int i=1;i<=n;i++) {
a[i]=read(),sum[i]=sum[i-1]+a[i];
while (tot && sta[tot].num>=a[i]) rig[sta[tot--].id]=i;
lef[i]=tot?sta[tot].id:0;
sta[++tot]=(Point){i,a[i]};
}
for (int i=1;i<=n;i++) {
if (!rig[i]) rig[i]=n+1;
ans=max(ans,a[i]*(sum[rig[i]-1]-sum[lef[i]]));
}
printf("%lld",ans);
return 0;
}
Luogu2422 | 良好的感觉 (单调栈)的更多相关文章
- luogu P2422 良好的感觉 单调栈
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long using namespace std; v ...
- HDU 6052 To my boyfriend(容斥+单调栈)
题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望. 思路: 啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个 ...
- poj 2769 感觉♂良好 (单调栈)
poj 2769 感觉♂良好 (单调栈) 比尔正在研发一种关于人类情感的新数学理论.他最近致力于研究一个日子的好坏,如何影响人们对某个时期的回忆. 比尔为人的一天赋予了一个正整数值. 比尔称这个值为当 ...
- hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)
What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten ar ...
- 【P2422】良好的感觉(单调栈优化DP//奇怪的暴力)
话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的.首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止...然后再操作一下,看上去时间O(N^2),然而由 ...
- 【Luogu】P2422良好的感觉(单调栈)
题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- 洛谷U4859matrix[单调栈]
题目描述 给一个元素均为正整数的矩阵,上升矩阵的定义为矩阵中每行.每列都是严格递增的. 求给定矩阵中上升子矩阵的数量. 输入输出格式 输入格式: 第一行两个正整数n.m,表示矩阵的行数.列数. 接下来 ...
- 【单调栈】Bzoj 1012: 最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6255 Solved: 2676[Submi ...
随机推荐
- vue路由--使用router.push进行路由跳转
手机赚钱怎么赚,给大家推荐一个手机赚钱APP汇总平台:手指乐(http://www.szhile.com/),辛苦搬砖之余用闲余时间动动手指,就可以日赚数百元 route-link是在html中静态定 ...
- redis教程-基础数据结构
需要整套redis缓存高可用集群教学视频的加qq:1324981084,本套视频从安装到集群的搭建和源码的解析,从零基础讲解. 一.Redis 有 5 种基础数据结构,分别为:string (字符串) ...
- [MySQL]mysql binlog回滚数据
1.先开启binlog log-bin = /var/log/mysql/mysql_bin #binlog日志文件,以mysql_bin开头,六个数字结尾的文件:mysql_bin.000001,并 ...
- 「Flink」事件时间与水印
我们先来以滚动时间窗口为例,来看一下窗口的几个时间参数与Flink流处理系统时间特性的关系. 获取窗口开始时间Flink源代码 获取窗口的开始时间为以下代码: org.apache.flink.str ...
- 史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点
史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点 1
- 《Git 从入门到体系》- 写给自己的话
我听过的对我很有冲击力的观点是:知识不成体系就是垃圾.这个观点不一定对,但是却是给我的冲击很大. 我记得以前在咖啡馆和一个博士医生聊天,他提出了这个观点:知识不成体系就是垃圾.听了这个观点我很想反驳他 ...
- clr from c# 字符 ,字符串 和 文本处理
1,字符----------在.net中,字符总是16位的Unicode代码值.每个字符都是一个System.Char结构(值类型)的一个实列. using System; public class ...
- .NET CORE(C#) WPF亚克力窗体
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF亚克力窗体 阅读导航 本文背景 代码实现 本文参考 源码 1 ...
- Integer使用==做判断遇到的问题
问题: 最近使用Integer类型的数据做判断时,遇到了一个神奇的问题. 如: Integer a=223; Integer b=223; 这样使用==做判断,得到的结果是 false 原因: 后来查 ...
- 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)
qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...