2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)
题目:https://nanti.jisuanke.com/t/38228
这题题解参考网上大佬的。
程序的L[i],R[i]代表a[i]这个点的值在区间 [L[i],R[i]] 中最小的并且能拓展到最左为L[i],最右为R[i]。
然后如果a[i]>0的情况就是 : a[i]*(Sum[R[i]]-Sum[L[i]-1])
如果a[i]<0那么这题就会变得复杂许多。需要预处理出Lmin[i],Rmin[i],Lmin[i]代表:以i为右端点的时候 Lmin[i]为左端点能得到区间和最小,Rmin[i]同理。
那么a[i]<0的最大值就是:a[i]*(Sum[ max(L[i],Lmin[i]) ]-Sum[ min(R[i],Rmin[i])-1 ])
具体细节可以看代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e5+;
const int INF=0x3f3f3f3f;
LL n,top,a[N],L[N],R[N],Sum[N],Lmin[N],Rmin[N];
struct dat{
LL idx,val;
}S[N]; int main()
{
cin>>n;
for (int i=;i<=n;i++) scanf("%lld",&a[i]);
for (int i=;i<=n;i++) Sum[i]=Sum[i-]+a[i]; a[n+]=-INF;
for (int i=;i<=n+;i++) {
while (top && a[i]<S[top].val) {
int id=S[top].idx;
L[id]=S[top-].idx+; R[id]=i-;
top--;
}
top++; S[top].idx=i; S[top].val=a[i];
} LL sum=,Max=,id=;
for (int i=;i<=n;i++) {
sum+=a[i];
Lmin[i]=id+;
if (sum>Max) Max=sum,id=i;
}
sum=; Max=; id=n+;
for (int i=n;i;i--) {
sum+=a[i];
Rmin[i]=id-;
if (sum>Max) Max=sum,id=i;
} LL ans=-INF;
for (int i=;i<=n;i++)
if (a[i]>=) ans=max(ans,a[i]*(Sum[R[i]]-Sum[L[i]-]));
else {
LL lm=max(L[i],Lmin[i]),rm=min(R[i],Rmin[i]);
ans=max(ans,a[i]*(Sum[rm]-Sum[lm-]));
}
cout<<ans<<endl;
return ;
}
2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)的更多相关文章
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- icpc 南昌邀请赛网络赛 Max answer
就是求区间和与区间最小值的积的最大值 但是a[i]可能是负的 这就很坑 赛后看了好多dalao的博客 终于a了 这个问题我感觉可以分为两个步骤 第一步是对于每个元素 以它为最小值的最大区间是什么 第二 ...
- 2019南昌邀请赛网络预选赛 M. Subsequence
传送门 题意: 给出一个只包含小写字母的串 s 和n 个串t,判断t[i]是否为串 s 的子序列: 如果是,输出"YES",反之,输出"NO": 坑点: 二分一 ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- 南昌网络赛 I. Max answer 单调栈
Max answer 题目链接 https://nanti.jisuanke.com/t/38228 Describe Alice has a magic array. She suggests th ...
- 2019牛客多校第四场C-sequence(单调栈+线段树)
sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...
- Feel Good POJ - 2796 (前缀和+单调栈)(详解)
Bill is developing a new mathematical theory for human emotions. His recent investigations are dedic ...
- 2019南昌邀请赛网络预选赛 I. Max answer(单调栈+暴力??)
传送门 题意: 给你你一序列 a,共 n 个元素,求最大的F(l,r): F(l,r) = (a[l]+a[l+1]+.....+a[r])*min(l,r); ([l,r]的区间和*区间最小值,F( ...
- 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)
传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...
随机推荐
- python实现WordCount(第三次作业)
0x00 注明 合作者:201631062315 201631062310 代码地址:https://gitee.com/c1e4r/word-count2 作业地址:https://edu.cnbl ...
- iframes
iframes提供了一个简单的方式把一个网站的内容嵌入到另一个网站中.但我们需要慎重的使用iframe.iframe的创建比其它包括scripts和css的 DOM 元素的创建慢了 1-2 个数量级. ...
- 23.倒计时器CountDownLatch
门闩是concurrent包中定义的一个类型,是用于多线程通讯的一个辅助类型. 门闩相当于在一个门上加多个锁,当线程调用await方法时,会检查门闩数量,如果门闩数量大于0,线程会阻塞等待. 当线程调 ...
- css强制换行和超出部分隐藏实现
一.强制换行 1 word-break: break-all; 只对英文起作用,以字母作为换行依据. 2 word-wrap: break-word; 只对英文起作用,以单词作为换行依据. 3 whi ...
- securityDemo依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit ...
- springcloud中provider-product依赖
<dependencies> <dependency> <groupId>cn.lijun.springcloud</groupId> <arti ...
- Ubuntu下Arm-Linux-GCC交叉编译环境的搭建
1.下载arm-linux-gcc-3.4.1.tar.bz2到临时的目录下. 2.解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3. ...
- 优雅的SpringMVC和Restful
一.前言 1.前段时间一直在写微信小程序的请求,终于把客户端的请求弄好了,可是服务端呢,该怎么写,纠结了半天,用servlet暂时写好了一个:http://www.cnblogs.com/JJDJJ/ ...
- Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!
刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID ...
- ecshop整合discuz教程完美教程
所需软件: ecshop安装包: ECShop_V2.7.3_UTF8_release1106.rarucenter安装包: UCenter_1.6.0_SC_UTF8.zipdiscuz! ...