ICPC nangchan I. Max answer
文章目录
- 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]<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]的前缀和的最小值,这样二者相减才是最小的
代码
#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相关推荐
- 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 ...
- 【计蒜客 - 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 ...
- 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解
以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational
Problem A PERFECT NUMBER PROBLEM https://nanti.jisuanke.com/t/38220 题解:打表 /* *@Author: STZG *@Langua ...
- 2019 ICPC南昌邀请赛网络赛比赛过程及题解
解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...
- The Preliminary Contest for ICPC China Nanchang National Invitational 南昌网络赛2019
题解不太详细,仅提供AC代码 A. PERFECT NUMBER PROBLEM #include <bits/stdc++.h> using namespace std;int main ...
- linux .vimrc教程,linux .vimrc的设置!
0.记得在配之前先下载vim.不同的版本下载vim使用不同命令 ubuntu使用sudo apt-get install vim 1.vi ~/.vimrc 打开当前用户下的vim的配置文件(修改完 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 【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 ...
最新文章
- python计算无穷级数求和常用公式_无穷级数-从入门到火葬
- 服务器安全配置之注册表设置
- Toby Walsh教授:四个指数趋势解释人工智能威胁论!
- mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc
- linux mysql 大页_Linux HugePages及MySQL 大页配置
- mysql安装了很久_mysql-5.7.21-winx64安装过程(整了好久原因是没关闭防火墙)
- mysql back blog_mysql的备份Xtrabackup
- Ubuntu服务器安装lamp
- Hadoop权威指南 _04_第I部分Hadoop基础知识_第2章关于MapReduce
- 训练过程acc_AI 深度学习训练tricks总结(均有实验支撑)
- pyintaller exe 后 print的内容 怎么体现_使用Github Actions自动化构建exe
- 跟ArthurXF学从雅虎抓取股票数据的方法
- spanT之高性能字符串操作实测
- python行号不显示_python IDLE添加行号显示教程
- 几何画板椭圆九种画法_详解椭圆的五种画法,很全面!!!
- suse 11添加阿里源
- PPT里快速插入上下角标
- VTK笔记-图形相关-两个平面上的多边形+三角带=闭合多边形(棱柱体)
- java计算机毕业设计教师科研成果管理源码+mysql数据库+系统+lw文档+部署
- 程序员计算机的b怎么换算,在计算机中,一个机器字是由几b组成的?