• luogu 2422 良好的感觉


    题目描述

    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

    分析

    这道题简直一模一样

    这道题用区间的开头结尾做状态不太可行,但这道题对于区间还有一种状态,最值

    好啦,这种题,我们可以发现对于某一个最小值,他的作用范围最大化可以使答案尽可能大

    所以直接求出每一个最小值的作用范围就好

    古人云,不贰过,不迁怒,但是我这个俗人已经在longlong上摔倒过n次了

    还有,因为单调队列(单调栈)维护的是区间的最值,有单调性,所以取出来的数不一定是正好大于a[i]的数

    这样就好

     1 /************************
     2 User:Mandy.H.Y
     3 Language:c++
     4 Problem:luogu2422
     5 Algorithm: 
     6 ************************/
     7 #include<bits/stdc++.h>
     8 
     9 using namespace std;
    10 
    11 const int maxn = 1e5 + 5;
    12 
    13 int n;
    14 long long ans;
    15 long long sum[maxn],a[maxn];
    16 int l,r,q[maxn];
    17 long long _left[maxn],_right[maxn];
    18 
    19 template<class T>inline void read(T &x){
    20     x = 0;bool flag = 0;char ch = getchar();
    21     while(!isdigit(ch)) flag |= ch == '-',ch = getchar();
    22     while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar();
    23     if(flag) x = -x;
    24 }
    25 
    26 void file(){
    27     freopen("2422.in","r",stdin);
    28     freopen("2422.out","w",stdout);
    29 }
    30 
    31 void readdata(){
    32     read(n);
    33 }
    34 
    35 void work(){
    36     for(int i = 1;i <= n; ++ i){
    37         read(a[i]);
    38         _left[i] = _right[i] = i;
    39         sum[i] = sum[i - 1] + a[i];
    40         while(l < r && a[i] <= a[q[r - 1]]) _left[i] = _left[q[r-1]],r--;
    41         q[r++] = i;
    42     }
    43 
    44     l = r = 0;
    45 
    46     for(int i = n;i >= 1; -- i){
    47         while(l < r && a[i] <= a[q[r - 1]]) _right[i] = _right[q[r-1]],r--;
    48         q[r++] = i;
    49     }
    50     
    51     for(int i = 1;i <= n; ++ i)
    52         ans = max(ans,(sum[_right[i]] - sum[_left[i]-1]) * a[i]);
    53     printf("%lld",ans);
    54 }
    55 
    56 int main(){
    57 //    file();
    58     readdata();
    59     work();
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    20+ 个高质量的 Web 按钮设计 PSD 下载
    12 月份 10 个新鲜的 jQuery 插件和教程
    20+ 个有用的 Google 地图的 jQuery 插件和教程
    5个界面效果很炫的JavaScript UI框架
    分享50个使用非比寻常导航菜单设计的创20111227creati意网站
    8 款为 WordPress 文章生成缩略图的插件
    百万级访问量网站的技术准备工作
    推荐8个独特应用的JQuery拖放插件
    开源软件发展史【信息图】
    iOS应用开发应遵循的10条设计原则
  • 原文地址:https://www.cnblogs.com/Mandy-H-Y/p/11463496.html
Copyright © 2020-2023  润新知