题目链接: 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. android9.0系统适配遇到的问题

    一.apk在9.0以下的系统上安装运行,没有问题.但是在9.0系统上运行会弹出一个框 解决办法: private void closeAndroidPDialog() { try { Class aC ...

  2. go笔记-值传递、引用传递

    eg: func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, ) } func main() { slice : ...

  3. 容器中的JVM资源该如何被安全的限制?

    前言 Java与Docker的结合,虽然更好的解决了application的封装问题.但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制. 这将导致JVM不能稳定服务 ...

  4. kuangbin最小生成树专题

    网址:https://vjudge.net/contest/66965#overview 第一题: poj1251 裸最小生成树 #include<iostream> #include&l ...

  5. java基础1之引用数据类型

    5种引用类型(对象类型) 类 接口 数组 枚举 标注 类 类在JVM的内存空间的存储 (1). Heap 堆空间:分配对象 new Student() 存放引用数据类型的实例 (2). Stack 栈 ...

  6. Android的LinearLayout中orientation默认值为什么是HORIZONTAL

    在一个偶然(闲着无聊)的过程中,突然非常好奇为什么LinearLayout在不指定排列方向为垂直(VERTICAL)时就得是水平方向(HORIZONTAL)排列的.产生这个疑问的时候脑子里蹦出来的第一 ...

  7. VScode中python环境配置

    vscode中python环境配置 想要在vscode中运行python代码必须要告诉vscode使用哪个解释器才行 方法1. 打开命令面板(Ctrl+Shift+P)输入Python: Select ...

  8. OpenFlow 交换机与控制器交互步骤

    1. Hello 控制器与交互及互相发送 Hello 消息.Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的 ...

  9. hdu 2829 Lawrence(四边形不等式优化dp)

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  10. macOS修改Dock隐藏速度

    延迟时间 修改延迟时间改为0,默认为1. defaults write com.apple.dock autohide-delay -int 0; killall Dock 修改为浮点数值,例如0.1 ...