I. Max answer(RMQ预处理前缀和)
题目链接: 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预处理前缀和)的更多相关文章
- Max answer(单调栈+ST表)
Max answer https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value o ...
- 计蒜客 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 ...
- 南昌网络赛 I. Max answer 单调栈
Max answer 题目链接 https://nanti.jisuanke.com/t/38228 Describe Alice has a magic array. She suggests th ...
- 2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)
题目:https://nanti.jisuanke.com/t/38228 这题题解参考网上大佬的. 程序的L[i],R[i]代表a[i]这个点的值在区间 [L[i],R[i]] 中最小的并且能拓展到 ...
- 南昌 Max answer
https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a interva ...
- 南昌邀请赛I.Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- 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 ...
- [hdu5247]rmq+预处理
题意:有一个无序数组,求有多少个长度为k的区间满足把区间内的数排序后是连续的. 思路:长度为k的区间排序后是 连续的数等价于maxval-minval等于k-1并且不同的数有k个(或者说没有相同的数) ...
随机推荐
- CentOS 7 安装Kubernetes(单机版)
一.关闭CentOS自带的防火墙服务 # systemctl disable firewalld # systemctl stop firewalld 二.安装etcd和Kubernetes软件( ...
- Win10系统如何在防火墙里开放端口
Win10系统如何在防火墙里开放端口(下面傻瓜式教学) 然后怎么做呢?????? 下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步......... 随便起个名字 KO
- SpringBoot使用JSP(官网Demo)
最开始接触java的时候,前端页面基本都是用jsp来写,最近公司项目要使用SpringBoot重构,查看SpringBoot文档,发现SpringBoot不建议使用JSP,因为jsp在使用内嵌serv ...
- Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册
记录一下搭建 Spring Cloud 过程中踩过的一些坑,测试的东西断断续续已经弄了好多了,一直没有时间整理搭建过程,时间啊~时间~ Spring 版本 Spring Boot:2.0.6.RELE ...
- 采用ADM2483磁隔离器让RS485接口更简单更安全
采用ADM2483磁隔离器让RS485接口更简单更安全 摘要:本文介绍RS485的特点及应用,指出了普通RS485接口易损坏的问题,针对存在的问题介绍了以ADM2483为核心的磁隔离解决方案. 关键词 ...
- Top Page
Top Page 由于个人的博客中涉及了几个不同的领域.今后准备设置Index页进行一番整理 : 所有其他页面都可以从这个页面遍历 Top Page
- c#, AOP动态代理实现动态权限控制(一)
因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货.需求: 用户分为管理员.普通用户 不同用户拥有不同功能权限 用户的权限可配置 新增功能时,不用修改权限配置 ...
- windows服务器nginx+php启动开源ecshop
1,下载php,nginx,ECShop源码 2,解压php到指定目录(如:C:\php-7.2.6) 2.1,找到指定目录下文件php.ini-development复制重命名为php.ini 2. ...
- 【翻译】asp.net core中使用MediatR
这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作 ...
- 如何去掉wordpress网站url里面的index.php(Apache服务器)
在wordpress根目录新建.htaccess文件,并拷贝以下代码保存即可. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase ...