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 ...
随机推荐
- 论文翻译:2015_DNN-Based Speech Bandwidth Expansion and Its Application to Adding High-Frequency Missing Features for Automatic Speech Recognition of Narrowband Speech
论文地址:基于DNN的语音带宽扩展及其在窄带语音自动识别中加入高频缺失特征的应用 论文代码:github 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never ...
- Java synchronized 关键字详解
Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...
- vue垂死挣扎--遇到的问题
1, 原生js监听浏览器后退及禁用返回 +. 涉及到的history的知识 2, watch监听路由变化
- centos7配置Logstash同步Mysql数据到Elasticsearch
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中.个人认为这款插件是比较稳定,容易配置的使用Logstash之前,我们得明确 ...
- 手把手教你搭建 ELK 实时日志分析平台
本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...
- Cassandra 在 360 的实践与改进
分享嘉宾:王锋 奇虎360 技术总监 文章整理:王彦 内容来源:Cassandra Meetup 出品平台:DataFunTalk 注:欢迎转载,转载请留言. 导读:2010年,Dropbox 在线云 ...
- 【JZOJ 5048】【GDOI2017模拟一试4.11】IQ测试
题目大意: 判断一个序列是否是另外一个序列删除若干个数字之后得到的. 正文: 我们可以定义两个指针,分别指向长序列和短序列. 拿样例来举例: 如果指针指的数相同,两个指针都往右跳: 如果不同,则指向长 ...
- python学习---文件修改
1.读一行,写一行,判断字符串,修改之. f=open("yesterday2","r",encoding="utf-8") f_new=o ...
- C#连接数据库的方法
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Android 调试桥 (adb) 是 命令行命令--官方拷贝过来的,留作自己查看
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令 ...