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 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...
随机推荐
- 使用while循环实现菜单
- mysql基于Altas读写分离并实现高可用
实验环境准备: master:192.168.200.111 slave1:192.168.200.112 slave2:192.168.200.113 Altas:192.168.200.114 c ...
- 进程启动到别的session下(作用)
https://blog.csdn.net/lostwifi/article/details/76472868 WTSGetActiveConsoleSessionId WTSEnumerateSes ...
- java 数组的定义
package java03; /* 数组的初始化:就是创建一个数组,并向其中古语一些默认的值 两种常见的初始化方式: 1.动态初始化(指定长度) 2.静态初始化(指定内容) 动态初始化数组格式: 数 ...
- java while循环
/* while 循环有一个标准格式,还有一个扩展格式 标准格式: while(条件表达式){ 循环体 } 扩展格式: 初始化语句; while(条件判断){ 循环体 步进表达式 } */ publi ...
- CNN基础三:预训练模型的微调
上一节中,我们利用了预训练的VGG网络卷积基,来简单的提取了图像的特征,并用这些特征作为输入,训练了一个小分类器. 这种方法好处在于简单粗暴,特征提取部分的卷积基不需要训练.但缺点在于,一是别人的模型 ...
- 【原理】Reids字典
I.字典的实现 Redis的字典使用哈希表作为底层实现. 1.1 哈希表 Redis字典所使用的哈希表结构定义如下: typedef struct dictht { // 哈希表数组 dictEntr ...
- Python--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
抽象类补充: import abc class Parent(metaclass= abc.ABCMeta): x=1 @abc.abstractclassmethod def foo(self): ...
- PHP curl_multi_select函数
curl_multi_select — 等待所有cURL批处理中的活动连接 说明 int curl_multi_select ( resource $mh [, float $timeout = 1. ...
- 【Flutter学习】页面布局之宽高尺寸处理
一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...