题干:

Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest value in the interval.

Now she is planning to find the max value of the intervals in her array. Can you help her?

Input

First line contains an integer n(1 \le n \le 5 \times 10 ^5n(1≤n≤5×105).

Second line contains nn integers represent the array a (-10^5 \le a_i \le 10^5)a(−105≤ai​≤105).

Output

One line contains an integer represent the answer of the array.

样例输入复制

5
1 2 3 4 5

样例输出复制

36

题目大意:

给你n个数,每个数范围 -1e5~1e5,让你选定一个区间,val=区间和*区间最小值,现在让你输出最大的val。

解题报告:

如果都是正数那就可以直接枚举最小值+单调栈。时间复杂度O(n).

但是这题有负数,所以不能用这种贪心的方法。考虑以正数当最小值,并不影响第一种做法的正确性。考虑负数当最小值,此时可能会出现多选了一些正数的情况,但是我们深知,我们现在想要的是区间和最小,所以我们找区间最小值就可以了。但是这个最小值不能是必须以某一个数开始。考虑先求出前缀和,然后对前缀和求RMQ问题,最终得到最小值。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<stack>
using namespace std;
typedef long long ll;
const int MAX = 5e5 + 5;
int n, l,r;
ll maxx=-1e18;
int a[MAX], L[MAX], R[MAX],qq[MAX];
ll sum[MAX],suf[MAX],dp1[MAX][25],dp2[MAX][25];
stack<int > sk;
void ST() {for(int i = 1; i<=n; i++) {dp1[i][0] = sum[i];dp2[i][0] = suf[i];}for(int j = 1; (1<<j) <= n; j++) {for(int i = 1; i+(1<<j)-1 <= n; i++) {dp1[i][j] = min(dp1[i][j-1] , dp1[i + (1<<(j-1))][j-1]);dp2[i][j] = min(dp2[i][j-1] , dp2[i + (1<<(j-1))][j-1]);}}for(int i = 1; i<=n; i++) {int k = 0;while(1<<(k+1) <= i) k++;qq[i] = k;}
}
ll cala(int l,int r) {if(l>r) return sum[l-1];int k = qq[r-l+1];return min(dp1[l][k],dp1[r- (1<<k) + 1][k]);
}
ll calb(int l,int r) {if(l>r) return suf[r+1];int k = qq[r-l+1];return min(dp2[l][k],dp2[r- (1<<k) + 1][k]);
}
int main()
{int t,i,j,k;ll tl,tr;cin>>n;for(i = 1; i<=n; i++) {scanf("%d",&a[i]);sum[i] = sum[i-1] + a[i];}for(i=n;i>=1;i--)suf[i]=suf[i+1]+a[i];for(int i = 1; i<=n; i++) {while(!sk.empty() && a[sk.top()] >= a[i]) sk.pop();if(sk.empty() ) L[i] = 0;else L[i] = sk.top();sk.push(i);}while(!sk.empty() ) sk.pop();for(int i = n; i>=1; i--) {while(!sk.empty() && a[sk.top() ] >= a[i]) sk.pop();if(sk.empty() ) R[i] = n+1;else R[i] = sk.top();sk.push(i);}ST();for(i=1;i<=n;i++){if(a[i]>=0)maxx=max(maxx,a[i]*(sum[R[i]-1]-sum[L[i]]));else {tl=cala(i+1,R[i]-1)-sum[i];tr=calb(L[i]+1,i-1)-suf[i];if(tl>0) tl=0;if(tr>0) tr=0;maxx=max(maxx,a[i]*(tl+tr+a[i]));}}printf("%lld\n",maxx);return 0 ;
}

【计蒜客 - 2019南昌邀请赛网络赛 - I】Max answer(单调栈,RMQ)相关推荐

  1. 【计蒜客 - 2019南昌邀请赛网络赛 - H】Coloring Game(找规律,思维dp)

    题干: David has a white board with 2 \times N2×N grids.He decides to paint some grids black with his b ...

  2. 【计蒜客 - 2019南昌邀请赛网络赛 - M】Subsequence(字典树,dp预处理)

    题干: Give a string SS and NN string T_iTi​ , determine whether T_iTi​ is a subsequence of SS. If ti i ...

  3. 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)

    Given a sequence of nn numbers a_1, a_2, \cdots, a_na1​,a2​,⋯,an​ and three functions. Define a func ...

  4. 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(一)

    D题:马的管辖 二进制枚举方案.判断该方案是否全部能被覆盖,将最优方案存下来并进行剪枝. #include<iostream> #include<cstring> #inclu ...

  5. 计蒜客 2019 蓝桥杯省赛 A 组模拟赛(一) B:炮台实验

    题目描述 蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,-,n 的炮台各一个,他需要把这 n 个炮台从左往右排成一行,并且炮口都朝向右边. 在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比自 ...

  6. 计蒜客2019蓝桥杯省赛B组模拟赛(一)题目及解析

    蓝桥杯历年真题题目及题解目录汇总   A. 结果填空:钟表 题库链接 分值: 5 一天蒜头君 22:28:45 开始睡觉,06:24:26 醒来之后,蒜头君在想,今天我睡了多久? 请你告诉蒜头君睡了& ...

  7. 计蒜客2019蓝桥杯省赛 B 组模拟赛(一)轻重搭配|

    题解:这题一看就知道是贪心问题,但问题是怎么贪,直接暴力循环一遍,TLE.选错贪心思路,只能过一小部分数据,正确贪心思路:从前一半遍历,在后一半中找到比当前元素的两倍大的数 代码如下: #includ ...

  8. 2019南昌邀请赛网络赛

      A. PERFECT NUMBER PROBLEM 这题没什么要说的. #include<bits/stdc++.h>using namespace std;int main(){co ...

  9. 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 马踏棋盘的问题

    //使用bfs #include<stdio.h> #include<iostream> #include<utility> #include<queue&g ...

最新文章

  1. LIVE 预告 | 旷视王剑锋:丢弃Transformer,FCN也可以实现端到端检测
  2. 使用String.format简化代码
  3. tebluea 仪表板如何联动_报告厅音响设备和辅助设备.doc
  4. Webpack4干货分享(二),使用loader处理scss,图片以及转换JS
  5. Java程序员都要懂得知识点:反射
  6. [laravel]用户异地登录后踢掉之前的登录
  7. Android Studio 常用快捷键
  8. groovy常用语法及实战
  9. VsCode字体颜色修改和背景图片修改 字体高亮
  10. 自然语言处理NLP星空智能对话机器人系列:理解语言的 Transformer 模型-子词分词器
  11. mysql安装教程 2018_sql server 2018下载
  12. VMware14安装步骤
  13. 说说“用户无线网络时不时断开重连”的故障!
  14. mysql 怎么加读锁_MYSQL—加写锁,加读锁,解锁
  15. 重启 WMI 服务。
  16. uni.showModal,uni.showToast使用
  17. windows如何切换到administrtor用户
  18. 【算法套路】-【递归篇】【递归三要素】
  19. 如何将Word/PDF转成高质量XML
  20. java内存分析工具_java内存查看与分析

热门文章

  1. 商业计划书最好就是十页篇幅
  2. 发现很多人的基础都不好
  3. python卸载opencv_20.Windows python,opencv的安装与卸载
  4. web前端表格css三个t的使用(thead,tbody,tfoot)
  5. oracle sal01,oracle中 all any in的用法
  6. esxi usb插口_酷暑大作战 | USB-C风扇新体验
  7. 如何修改emcp的sn号_百家号领域选择错误怎么办?百家号怎么更改领域?
  8. word 7桌面上的计算机图标是,怎么设置win7系统桌面图标都变成word图标的处理办法...
  9. java串口监听超时_从串口读取时如何实现read()的超时(C / C)
  10. WinCE中得Catalog Items前的标记图标的意义总结