P2422 良好的感觉(两头单调)
描述:https://www.luogu.com.cn/problem/P2422
kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?
先考虑暴力。
怎么暴力?我会枚举区间左右端点
光是枚举左右端点就已经T飞了
我们考虑最小值有多少种情况?
没错,是n种,每个数都可能是最小值。
如果把某个数当成区间最小值的话,那么在保证最小的前提下,区间越大越好
但是问题来了。区间和可以用前缀和优化,那怎么定区间呢?
说白了,我们想找到这个数左边第一个更小的数记作L和右边第一个更小的数记作R
怎么办?单调队列
当压入一个数的时候,会弹出一些更小的数,那么其实弹出的那些数的R值就是本数
同样,当无法从队列里弹出数的时候,那么本数的L值就是那个在队列尾的数
至于一个数的右边或者左边没有更小的数时,我们认为把它们设置为下标为0,n+1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll a[],q[],p[];
ll l[],r[],sumn[];
int main()
{
cin>>n;
ll tail=,head=;
for(int i=;i<=n;i++)
{
scanf("%ld",&a[i]);
sumn[i]=sumn[i-]+a[i];
while(tail>=head&&a[i]<q[tail])
{
//a[i]是被踢掉元素右边的第一个更小的元素
r[p[tail]]=i;
tail--;
}
l[i]=p[tail];//踢到不能踢为止,那个踢不动的就是左边第一个更小的元素
q[++tail]=a[i],p[tail]=i;
}
sumn[n+]=sumn[n];
for(int i=;i<=n;i++)
{
if(l[i]==) l[i]=;
if(r[i]==) r[i]=n+;
}
ll ans=;
for(int i=;i<=n;i++)
ans=max(ans,a[i]*(sumn[r[i]-]-sumn[l[i]]));
cout<<ans;
}
P2422 良好的感觉(两头单调)的更多相关文章
- 【Luogu】P2422良好的感觉(单调栈)
		
题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...
 - P2422 良好的感觉
		
P2422 良好的感觉 给定一段序列, 其中元素 \(0 \leq a_{i} \leq 100000\) 定义一段子段 \([L, R]\) 的舒适值为 \(\min_{L \leq i \leq ...
 - 洛谷 P2422 良好的感觉 题解
		
P2422 良好的感觉 题目描述 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感 ...
 - luogu P2422 良好的感觉  单调栈
		
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long using namespace std; v ...
 - 【P2422】良好的感觉(单调栈优化DP//奇怪的暴力)
		
话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的.首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止...然后再操作一下,看上去时间O(N^2),然而由 ...
 - 洛谷P2422 良好的感觉
		
题目意思就是:最大化一个区间的和与这个区间的最小值的乘积. 换一个角度看问题,如果我们穷举一个最小值 $ a_i $ ,然后往左右扩展,显然是对的,复杂度 $ O(n^2) $.所以我们要优化一下这个 ...
 - poj_2559 单调栈
		
题目大意 给出一个柱形图中柱子的高度,每个柱子的宽度为1,柱子相邻.求出柱形图中可能形成的矩形的最大面积. 题目分析 以每个柱子(高度为h[i])为中心,向两边延展求出以该h[i]为高度的矩形的最大宽 ...
 - 【思维题  单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
		
t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...
 - Python安装、配置图文详解(转载)
		
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
 
随机推荐
- Golang中的Gosched、Goexit、GOMAXPROCS
			
Golang进程权限调度包runtime三大函数Gosched,Goexit,GOMaXPROCS runtime.Gosched(),用于让出CPU时间片,让出当前goroutine的执行权限,调度 ...
 - mount --bind绑定命令
			
将目录或文件DirFile-1绑定到目录或文件DirFile-2上,所有对DirFile-2的访问就是对DirFile-1的访问 mount --bind [DirFile-1] [DirFile-2 ...
 - mysql 不能对同一个表进行 update(delete) 和 select 联合操作
			
eq: update a set a.x = 1 where a.y in (select a.x from a); 上边语法是错误的,在对aupdate 时不能再条件中对同一个a表进 ...
 - 【python实现卷积神经网络】padding2D层实现
			
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
 - Alpha Release Note 12/15/2015
			
内容提要: ******Personal Photo Experience可供您存放所有的私人照片,系统会自动整理内容,您可以借助搜索功能快速找到所需图片,同时过滤重复图片和低质量图片,给您全新的搜索 ...
 - Spring Cloud 系列之 Gateway 服务网关(二)
			
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Gateway 服务网关(一) 本篇文章讲解 Gateway 网关的多种路由规则.动态路由规则(配合服务发现的路由规则 ...
 - 将函数作为返回值的方法 - Python
			
有的时候,我们需要将函数作为返回值,以下为代码: def superfunc(): i = 0 def wrapper(): nonlocal i i +=1 return i return wrap ...
 - 1. ajax递归并发处理
			
在某些情况下可能会需要循环ajax请求,可以利用递归发送 function recursion( index,array ) { if ( index < array.length ) { // ...
 - [JS] 自己弄得个倒计时
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - MyBatis model、xml、mapper 自动生成,附源码
			
Mybatis 代码自动生成 model.xml.mapper 代码结构图 代码地址 https://github.com/shootercheng/codegen 需要修改的地方见 readme