题目链接: https://nanti.jisuanke.com/t/38228

题目大意:给你n个数,让你找出一个区间中f的最大值,具体的f计算方法,这段区间的和乘以这段区间的最小值。

具体思路:我们枚举每个位置,对于当前位置的数,通过二分 找出这个数作为区间最小值能够到达的最左端和最右端。如果是正数,我们直接a[i]*这段区间和就可以了,因为都是正数。

如果当前的a[i]是负数,对于这个点的右段,我们找出一个前缀和最小的点,然后对于这个点的左端,我们找出一个前缀和最大的,这样就能保证选定的区间是最小的了,负数*负数=正数。

预处理出前缀和在每段区间的最小值,最大值,以及每个区间中a[i]的最小值。

感谢qyn的讲解。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 5e5+;
ll dp1[maxn][],dp2[maxn][],dp3[maxn][];
ll a[maxn];
ll qian[maxn];
int n;
void RMQ1()
{
for(int i=; i<=; i++)
{
for(int j=; j<=n; j++)
{
if(j+(<<i)-<=n)
{
dp1[j][i]=min(dp1[j][i-],dp1[j+(<<(i-))][i-]);
}
}
}
}
void RMQ2()
{
for(int i=; i<=; i++)
{
for(int j=; j<=n; j++)
{
if(j+(<<i)-<=n)
{
dp2[j][i]=max(dp2[j][i-],dp2[j+(<<(i-))][i-]);
}
}
}
}
void RMQ3()
{
for(int i=; i<=; i++)
{
for(int j=; j<=n; j++)
{
if(j+(<<i)-<=n)
{
dp3[j][i]=min(dp3[j][i-],dp3[j+(<<(i-))][i-]);
}
}
}
}
bool judge(int l,int r,ll val)
{
int k=;
k=(int)log2((double)(r-l+));
ll tmp=min(dp1[l][k],dp1[r-(<<k)+][k]);
return tmp==val;
}
int Find_l(int pos)
{
int l=,r=pos;
int ans=pos;
while(l<=r)
{
int mid=(l+r)>>;
if(judge(mid,pos,a[pos]))
{
ans=mid;
r=mid-;
}
else
l=mid+;
}
return ans;
}
int Find_r(int pos)
{
int l=pos,r=n;
int ans=pos;
while(l<=r)
{
int mid=(l+r)>>;
if(judge(pos,mid,a[pos]))
{
ans=mid;
l=mid+;
}
else
r=mid-;
}
return ans;
}
int get_max(int l,int r)
{
int k=;
k=(int)log2((double)(r-l+));
ll tmp=max(dp2[l][k],dp2[r-(<<k)+][k]);
return tmp;
}
int get_min(int l,int r)
{
int k=;
k=(int)log2((double)(r-l+));
ll tmp=min(dp3[l][k],dp3[r-(<<k)+][k]);
return tmp;
}
int main()
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i]);
dp1[i][]=a[i];
qian[i]=qian[i-]+a[i];
dp2[i][]=dp3[i][]=qian[i];
}
RMQ1(); /// 区间最小值,在每一次询问的时候求出最左边的端点和最右边的端点
RMQ2();/// 前缀和最大值
RMQ3(); /// 前缀和最小值
ll ans=;
for(int i=; i<=n; i++)
{
int t1=Find_l(i);
int t2=Find_r(i);
if(a[i]>)
ans=max(ans,(qian[t2]-qian[t1-])*a[i]);
else
{
ans=max(ans,a[i]*(get_min(i,t2)-get_max(t1,i)));
}
}
printf("%lld\n",ans);
return ;
}

I. Max answer(RMQ预处理前缀和)的更多相关文章

  1. Max answer(单调栈+ST表)

    Max answer https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value o ...

  2. 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛

    Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...

  3. 南昌网络赛 I. Max answer 单调栈

    Max answer 题目链接 https://nanti.jisuanke.com/t/38228 Describe Alice has a magic array. She suggests th ...

  4. 2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)

    题目:https://nanti.jisuanke.com/t/38228 这题题解参考网上大佬的. 程序的L[i],R[i]代表a[i]这个点的值在区间 [L[i],R[i]] 中最小的并且能拓展到 ...

  5. 南昌 Max answer

    https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a interva ...

  6. 南昌邀请赛I.Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...

  7. 南昌网络赛 I. Max answer (单调栈 + 线段树)

    https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...

  8. Max answer(The Preliminary Contest for ICPC China Nanchang National Invitational)

    Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values ...

  9. [hdu5247]rmq+预处理

    题意:有一个无序数组,求有多少个长度为k的区间满足把区间内的数排序后是连续的. 思路:长度为k的区间排序后是 连续的数等价于maxval-minval等于k-1并且不同的数有k个(或者说没有相同的数) ...

随机推荐

  1. P1273 有线电视网

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  2. Android测试(四):Instrumented 单元测试

    原文:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html Instrume ...

  3. FineUIPro/Mvc/Core/JS v4.2.0 发布了(老牌ASP.NET控件库,WebForms,ASP.NET MVC,Core,JavaScript)!

    还记得 10 年前那个稍微青涩的 ExtAspNet 吗,如今她已脱胎换骨,变成了如下 4 款产品: FineUIPro:基于jQuery的经典款ASP.NET WebForms控件,之前的FineU ...

  4. pyspider常见错误

    安装完爬虫框架pyspider之后,使用pyspider all 命令,可能会出现以下错误: - Deprecated option 'domaincontroller': use 'http_aut ...

  5. 03-JavaScript之数据类型

    JavaScript之数据类型 1.介绍 JavaScript数据类型分为两类:原始类型(primitive type)和对象类型(object type) 2.原始类型 数字 - number.字符 ...

  6. @deprecated 的方法处理

    因为需要用到poi,偷懒不太想看官方文档,同时自己的github账号忘记密码了.所以直接在别人博客那拷贝一段代码来模仿修改创建HSSF的xsl文件. 虽然能运行,但发现代码太多横线,可以知道方法被标注 ...

  7. NOIP2002普及组复赛B 选数

    题目链接:https://ac.nowcoder.com/acm/contest/230/B 题目大意: 略 分析: DFS模板题. 代码如下: #include <bits/stdc++.h& ...

  8. centos7之添加开机启动服务/脚本

    一.添加开机启动脚本 #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to ...

  9. JSON数组形式字符串转换为List<Map<String,String>>的8种方法

    package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...

  10. 拷贝文件到服务器 提示FTP文件夹错误

    FTP文件夹错误将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上.详细信息:200 Type set to I.227Entering Passive Mode (122,11 ...