题目描述

kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?

输入输出格式

输入格式:

第一行为N,代表数据记录的天数

第二行N个整数,代表每一天的感受值

输出格式:

一行,表示在最舒适的一段时间中的感受值。

输入输出样例

输入样例#1:

6
3 1 6 4 5 2
输出样例#1:

60

说明

样例解释:

kkk最开心的一段时间是第3天到第5天,开心值:(6+4+5)*4=60

对于30%的数据,1<=N<=100

对于70%的数据,1<=N<=2000

对于100%的数据,1<=N<=100000,1<=感受值<=1000000


一看貌似就是单调队列优化DP...

然后越看越不像...

我们想一下暴力怎么写,枚举一个点i,值为x,找到左边第一个小于x的位置记为l, 同样的找到右边第一个小于x的位置记作r。

于是显然我们的答案就是x*(qzh[r]-qzh[l-1]),qzh指前缀和数组。这样显然是O(n^2)的,我们考虑优化。

因为题目的特性,很容易想到用单调栈维护递增序列。

我们用单调栈存储下标,保证下标对应的值是单调递增的。

于是我们对于一个新位置i,它的值为x,然后弹掉栈顶值比x大的,直到val[stack[top]] < x。

我们把弹出的那些下标的右端点(即右边第一个比它的值小的位置)设为i。

然后对于新插入的i,我们把i的左端点(与上面类似)设为top-1。

考虑这个做法的正确性。

我们的栈里的坐标是单调递增的,值也是单调递增的,我们新插入的值也如果比前面的小,一定是第一个比前面小的数(显然)。

我们弹晚之后剩下的最后一个一定是坐标最大的比x小的数。

所以我们处理完以上之后再O(n)统计一下答案就行了。


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
inline int read(){
int res=;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){res=(res<<)+(res<<)+(ch^);ch=getchar();}
return res;
}
#define ll long long int n;
int a[];
ll qzh[];
ll stack[], top; //维护下标
int le[], ri[];
ll ans; int main()
{
n = read();
for (int i = ; i <= n ; i ++) a[i] = read(), qzh[i] = qzh[i-] + a[i];
for (int i = ; i <= n ; i ++)
{
while(top and a[stack[top]] >= a[i]) ri[stack[top--]] = i;
le[i] = stack[top];
stack[++top] = i;
}
for (int i = ; i <= n ; i ++) {if (!le[i]) le[i] = ;if (!ri[i]) ri[i] = n;}
for (int i = ; i <= n ; i ++) ans = max(ans, a[i] * (qzh[ri[i]-] - qzh[le[i]]));
printf("%lld\n", ans);
return ;
}

[Luogu2422]良好的感觉的更多相关文章

  1. Luogu2422 | 良好的感觉 (单调栈)

    题目描述 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中 ...

  2. 用Go语言做产品半年的一些感觉

    用Go语言做产品刚好半年,有一些感觉跟大家说道说道. 在使用Go之前,我常常想象,无法使用先进的Debug工具会对工作进度造成多么巨大的影响.甚至在Visual Studio的娇惯下认为,不能调试基本 ...

  3. 推荐一篇关于java 学习的文章,感觉写的很不错

    ---恢复内容开始---    很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛 ...

  4. 第一次使用UML的感觉

    刚开始接触的时候,其实我内心是拒绝的,因为感觉这种软件之前接触过,觉得就是相当于思维导图那种的. 可当自己使用的时候,觉得大纲总体上是类似是规划方向的,可是细节却让人深思,用什么图标,特别是用什么线, ...

  5. 迅雷9、迅雷极速版之迅雷P2P加速:流量吸血鬼?为什么你装了迅雷之后电脑会感觉很卡很卡?

    原文地址:http://www.whosmall.com/post/90 关闭极速版迅雷ThunderPlatform.exe进程 ThunderPlatform.exe目的:利用P2P技术进行用户间 ...

  6. 开发Windows Phone应用程序之后的感觉

    刚刚历时一个多月完成了酒美网(我之前的公司)Windows Phone版客户端,发现自己的自学能力还可以,但是还是有好多东西摸不清,到今天我才刚刚对MVVM入门,更对MVVMLight这个框架有进一步 ...

  7. 自己写的一个SqlHelper,感觉使用起来挺方便的

    自己写的一个SqlHelper,感觉使用起来挺方便的 using System; using System.Data; using System.Collections.Generic; using ...

  8. 测试一下Word发布刚刚发现通过Word 可以直接发Blog 感觉很新奇,先看看,如果可以呢,将发通知的改了。

      刚刚发现通过Word 可以直接发Blog 感觉很新奇,先看看,如果可以呢,将发通知的改了.   刚刚发现通过Word 可以直接发Blog 感觉很新奇,先看看,如果可以呢,将发通知的改了.     ...

  9. 推荐一些常用感觉不错的jQuery插件

    转:http://www.cnblogs.com/v10258/p/3263939.html JQuery插件繁多,下面是个人在工作和学习中用到感觉不错的,特此记录. UI: jquery UI(官方 ...

随机推荐

  1. 搜索入门练习题9 LETTERS 题解

    题目出处:<信息学奥赛一本通>第五章上机练习1 或者 POJ1154 题目描述 给出一个 \(R\times S\) 的大写字母矩阵,一开始你所处的位置在左上角,你可以向上下左右四个方向移 ...

  2. centos7上安装zookeeper

    centos7上安装zookeeper 1 准备工作 1.准备服务器,本次安装采用 centos7系统.内存2G.存储60G的虚拟机服务器一台: 2.服务器安装java环境: 参考文章<cent ...

  3. 模板引擎Velocity学习系列-#set指令

    #set指令 #set指令用于向一个变量或者对象赋值. 格式: #set($var = value) LHS是一个变量,不要使用特殊字符例如英文句号等,不能用大括号括起来.测试发现#set($user ...

  4. Asp.net Windows 身份验证-域验证

    一.在web.config中设置: <authentication mode="Windows" /> 二.获取计算机名\账户名 使用代码:HttpContext.Cu ...

  5. [Spark] 06 - What is Spark Streaming

    前言 Ref: 一文读懂 Spark 和 Spark Streaming[简明扼要的概览] 在讲解 "流计算" 之前,先做一个简单的回顾,亲! 一.MapReduce 的问题所在 ...

  6. 二叉树总结(五)伸展树、B-树和B+树

    一.伸展树 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作. 因为,它是一颗二叉排序树,所以,它拥有二叉查找树的性质:除此之外,伸展树还具有的一个特点 ...

  7. 【linux】【FastDFS】FastDFS安装

    前言 FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存 ...

  8. linux双网卡绑定为逻辑网卡

    网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术. 生产环境服务器为:DELL 网卡为:光纤 bond需要修改涉及的网卡配置文件 /e ...

  9. Android Studio [登陆界面]

    EdittextActivity.class package com.xdw.a122; import android.support.v7.app.AppCompatActivity; import ...

  10. 为何stop()和suspend()方法不推荐使用(转)

    stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性. 用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器.如果以前 ...