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 ...
随机推荐
- 反弹shell备忘录
反弹shell备忘录 简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80,这是因为在服务器上面开启了80端口的监 ...
- 基于Travis CI实现 Gitbook在 Github 和 Coding 的同步部署
前言 最近发现自己的博客在使用vpn的情况下打开很慢,百度站点也抓取失败,于是将自己的博客借助hexo-deploy 插件很容易同步部署到了coding上.只需要在你的hexo配置文件_config. ...
- 在centos7.x环境中SQL Server附加数据库
第一步,准备好windows与Linux之间文件传递的工具,下载并安装 https://winscp.net/eng/download.php 第二步,把本地的数据库文件拷贝一份,放到别的文件夹中,因 ...
- eclipse中一个项目引用另一个项目的方法
我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...
- cmake 指定编译特定可执行文件
最近进行编译项目,但是项目中有很多可执行文件:每次编译起来比较费时,下面一组代码可以指定特定的编译目标进行编译,而不用编译所有目标: #!/bin/bash # 通过传递第一个参数,表示要编译的目标: ...
- LeetCode 56. Merge Intervals 合并区间 (C++/Java)
题目: Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6] ...
- MySQL 8 升级数据库
开始升级前 因为从MySQL 8.0 到MySQL 5.7,或者从MySQL 8.0 到之前的 MySQL 8.0版本都是不支持的.所有在在升级前要做好数据库备份,包括mysql 系统schema(数 ...
- ArcMap 发布地图服务,提示发布工具没有启动
Error: The server is not ready for publishing. Please check if the Publishing Tools on the server ar ...
- KindEditor配置和使用
1下载kindeditor包,目前最新版本是kindeditor-3.5.5.下载地址:http://www.kindsoft.net/ 2.解压之后,解压目录kindeditor如下图所示. 3.开 ...
- ES6数组去重方法
Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员),操作方法有:add(value).delete(value).has(value).clear():遍历方法有:keys ...