文章目录

  • I. Max answer
    • 分析
    • 代码

I. Max answer

分析

题意: 定义一个区间的值为这个区间最小值乘以区间和
分析:我们要枚举每一个值作为区间最小值时的贡献即可,这样不会漏掉任何情况,但是我们需要统计一个信息,确定了区间最小值,我们还要枚举这个区间,这个区间的最小值已经确定,但是左右边界却不知道,怎么确定左右边界呢?
1.单调栈可以统计一个值作为区间最小值左右端点的信息,不清楚的同学可以先去学习学习单调栈,当它进栈的时候,栈中上一个元素的位置,就是左边界,当它出栈的时候,就是它的右边界
2. 左右边界确定了,怎么在这个范围内求一个最大的区间呢?我们知道区间和可以看成前缀和相减,那么如果,假设左右边界为lmin[i]+1,rmin[i]−1lmin[i]+1,rmin[i]-1lmin[i]+1,rmin[i]−1
3. a[i]>0a[i] > 0a[i]>0, 我们需要查询 [lmin[i],i−1][lmin[i],i-1][lmin[i],i−1]前缀和的最小值,[i,rmin[i]−1][i,rmin[i]-1][i,rmin[i]−1]的前缀和的最大值,这样二者相减才是最大的
4. a[i]&lt;0a[i] &lt; 0a[i]<0,我们需要查询[lmin[i],i−1][lmin[i],i-1][lmin[i],i−1]前缀和的最大值,[i,rmin[i]−1][i,rmin[i]-1][i,rmin[i]−1]的前缀和的最小值,这样二者相减才是最小的

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 5e5+10;
int a[maxn];
LL dpmx[maxn][19],dpmi[maxn][19],s[maxn];
int lmin[maxn],rmin[maxn],st[maxn];
void initrmq(int n){for(int i = 1;i <= n; ++i)dpmx[i][0] = s[i],dpmi[i][0] = s[i];// cout<<dpmx[2][0]<<endl;int x = 0;while((1<<(x+1)) <= n) ++x;// cout<<x<<endl;for(int i = 1;i <= x; ++i){for(int j = 1;j+(1<<i)-1 <= n; ++j){dpmx[j][i] = -1e18;dpmi[j][i] = 1e18;dpmx[j][i] = max(dpmx[j][i-1],dpmx[j+(1<<(i-1))][i-1]);dpmi[j][i] = min(dpmi[j][i-1],dpmi[j+(1<<(i-1))][i-1]);// cout<<i<<" "<<j<<" "<<dpmx[j][i]<<endl;}}
}
// 传入op = 1 ,表示最小值,op = 0 ,代表最小值LL rmqquery(int l,int r,int op){l++,r++;LL _min,_max;_min = 1e18;_max = -1e18;int x = 0;while((1<<(x+1)) <= r-l+1)++x;_min = min(dpmi[l][x],dpmi[r-(1<<x)+1][x]);_max = max(dpmx[l][x],dpmx[r-(1<<x)+1][x]);return op?_min:_max;
}
int main(void){int n;cin>>n;for(int i = 1;i <= n; ++i)scanf("%d",&a[i]),s[i+1] = s[i]+a[i];initrmq(n+1);// rmqquery(5,5,0)// cout<<s[n]<<endl;// cout<<    rmqquery(2,n-1,1)<<endl;int l = 1,r = 0;for(int i = 1;i <= n; ++i){while(r >= l&& a[i] < a[st[r]]){rmin[st[r]] = i;r--;}lmin[i] = st[r];st[++r] = i;}while(r >= l)rmin[st[r]] = n+1,r--;// for(int i = 1;i <= n; ++i)//     cout<<lmin[i]<<" "<<rmin[i]<<endl;LL ans = -1e18;for(int i = 1;i <= n; ++i){LL _m;if(a[i] > 0){_m = rmqquery(i,rmin[i]-1,0)-rmqquery(lmin[i],i-1,1);}else{_m = rmqquery(i,rmin[i]-1,1)-rmqquery(lmin[i],i-1,0);// cout<<rmqquery(i,rmin[i]-1,1)<<" "<<rmqquery(lmin[i],i-1,0)<<endl;}// cout<<i<<" "<<_m<<endl;ans = max(ans,a[i]*_m);}cout<<ans<<endl;return 0;
}

ICPC nangchan I. Max answer相关推荐

  1. ICPC China Nanchang National Invitational - I. Max answer(线段树+ST)

    题目链接 N个数字求一个区间使得∑i=li=ra[i]×∑i=li=rmin(a[i])\sum_{i=l}^{i=r} a[i] × \sum_{i=l}^{i=r}min(a[i])∑i=li=r ...

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

    题干: Alice has a magic array. She suggests that the value of a interval is equal to the sum of the va ...

  3. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...

  4. The Preliminary Contest for ICPC China Nanchang National Invitational

    Problem A PERFECT NUMBER PROBLEM https://nanti.jisuanke.com/t/38220 题解:打表 /* *@Author: STZG *@Langua ...

  5. 2019 ICPC南昌邀请赛网络赛比赛过程及题解

    解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...

  6. The Preliminary Contest for ICPC China Nanchang National Invitational 南昌网络赛2019

    题解不太详细,仅提供AC代码 A. PERFECT NUMBER PROBLEM #include <bits/stdc++.h> using namespace std;int main ...

  7. linux .vimrc教程,linux .vimrc的设置!

    0.记得在配之前先下载vim.不同的版本下载vim使用不同命令 ubuntu使用sudo apt-get install vim 1.vi ~/.vimrc  打开当前用户下的vim的配置文件(修改完 ...

  8. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  9. 【leetcode】Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

最新文章

  1. python计算无穷级数求和常用公式_无穷级数-从入门到火葬
  2. 服务器安全配置之注册表设置
  3. Toby Walsh教授:四个指数趋势解释人工智能威胁论!
  4. mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc
  5. linux mysql 大页_Linux HugePages及MySQL 大页配置
  6. mysql安装了很久_mysql-5.7.21-winx64安装过程(整了好久原因是没关闭防火墙)
  7. mysql back blog_mysql的备份Xtrabackup
  8. Ubuntu服务器安装lamp
  9. Hadoop权威指南 _04_第I部分Hadoop基础知识_第2章关于MapReduce
  10. 训练过程acc_AI 深度学习训练tricks总结(均有实验支撑)
  11. pyintaller exe 后 print的内容 怎么体现_使用Github Actions自动化构建exe
  12. 跟ArthurXF学从雅虎抓取股票数据的方法
  13. spanT之高性能字符串操作实测
  14. python行号不显示_python IDLE添加行号显示教程
  15. 几何画板椭圆九种画法_详解椭圆的五种画法,很全面!!!
  16. suse 11添加阿里源
  17. PPT里快速插入上下角标
  18. VTK笔记-图形相关-两个平面上的多边形+三角带=闭合多边形(棱柱体)
  19. java计算机毕业设计教师科研成果管理源码+mysql数据库+系统+lw文档+部署
  20. 程序员计算机的b怎么换算,在计算机中,一个机器字是由几b组成的?

热门文章

  1. Android8.thumbnails,Android Thumbnail 攻略
  2. 新加坡风险投资公司将投资1000万美元建立加密货币区块链投资基金
  3. CTF-攻防世界web新手入门篇
  4. 程序人生(创)一个新手程序员的两三事(未完待续...)
  5. 拆解KinectFusion算法之TSDF
  6. 计算圆周率π和显示进度条
  7. scrapy框架菜鸟学习记录
  8. Java中导出pdf文件,pdf工具类demo
  9. The Home Depot - 家得宝
  10. 基于Mysql 的SQL应用---2021(ZSD版)