题目传送门:http://poj.org/problem?id=2796

  这道题的话我用了RMQ和二分。

  思想:用minm来表示区间[L,R]的最小值,很明显一个区间[L,R]能取得的最大值,要么就是[L,minm-1],要么就是[minm+1,R],还有就是整个区间的和乘最小值。

  因为对于某两个最小值相等的区间来说(题目说明是非负整数),显然越大的区间取得的最大值越大。

    

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100010;
int num[maxn],n,sum[maxn],fmin[maxn][20],fmax[maxn][20];
long long ans=0,ansl,ansr;int querymin(int l,int r)
{int k=0;if (l>r)return 0;while (1<<(k+1)<=r-l+1)k++;return min(fmin[l][k],fmin[r-(1<<k)+1][k]);
}int querymax(int l,int r)
{int k=0,tmp=0;if (l>r)return 0;while (1<<(k+1)<=r-l+1)k++;tmp=max(fmax[l][k],fmax[r-(1<<k)+1][k]);tmp=max(tmp,(sum[r]-sum[l-1])*querymin(l,r));if (tmp>ans){ans=tmp;ansl=l;ansr=r;}return tmp;
}void findmin()                                          //用RMQ求第i个到第j个这个区间的最小值是哪一个
{int i,j;memset(fmin,0x7f,sizeof(fmin));for (i=1;i<=n;i++)fmin[i][0]=i;for (j=1;(1<<j)<=n;j++)for (i=1;i+(1<<j)-1<=n;i++)if (num[fmin[i][j-1]]<num[fmin[i+(1<<(j-1))][j-1]])fmin[i][j]=fmin[i][j-1];else fmin[i][j]=fmin[i+(1<<(j-1))][j-1];
}void findmax()                                           //表示求第i个到第j个这个区间能取得的最大值
{int i,j,l,r;memset(fmax,0,sizeof(fmax));for (i=1;i<=n;i++)fmax[i][0]=num[i]*num[i];for (j=1;(1<<j)<=n;j++)for (i=1;i+(1<<j)-1<=n;i++){r=i+(1<<j)-1;l=querymin(i,r);fmax[i][j]=max(querymax(i,max(i,l-1)),querymax(max(l+1,r),r));fmax[i][j]=max(fmax[i][j],(sum[r]-sum[i-1])*num[l]);if (fmax[i][j]>ans){ans=fmax[i][j];ansl=i;ansr=r;}}
}int main()
{int i,j;scanf("%d",&n);sum[0]=0;for (i=1;i<=n;i++){scanf("%d",&num[i]);sum[i]=sum[i-1]+num[i];}findmin();findmax();cout<<ans<<endl<<ansl<<" "<<ansr<<endl;return 0;
}

转载于:https://www.cnblogs.com/Sun-Sea/p/5236834.html

[POJ2796]Feel Good相关推荐

  1. upc组队赛1 小C的数学问题【单调栈】(POJ2796)

    小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...

  2. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  3. div滚动到指定位置 vue_Vue列表实现滚动到指定位置样式改变

    这个需求大概是这样子: 我做的一个聊天Demo,在搜索框搜索用户,可以滚动到指定的用户.然后成选中状态. 这是目前状态,我搜索南宫仆射 ,想要下面的用户列表直接滚动到 南宫仆射 并改变CSS样式. 查 ...

  4. 蒟蒻的ACM数据结构(四)-单调队列和单调栈

    单调队列和单调栈 一.概念 二.实现 三.题目 单调队列 洛谷P1886 滑动窗口 解析 单调栈 [GXOI/GZOI2019]与或和 解析 POJ3250 Bad Hair Day 解析 POJ 2 ...

最新文章

  1. 1035 插入与归并
  2. 大学生职业生涯规划书性格特征_搞定职业生涯规划书,看这里!
  3. 作者:李崇纲,男,北京金信网银金融信息服务有限公司常务副总经理。
  4. java.sql.SQLException: 关闭的连接 解决办法
  5. python中__init__.py是干什么的
  6. 资源管理器停止工作,自动重启
  7. 我的第一个keil工具写的汇编
  8. 网站发布在中文操作系统,但ReportViewer的工具栏显示为英文的解决方法
  9. 粉丝关注数据库表的设计
  10. c#怎么拟合函数得到参数_c#怎么拟合函数得到参数_最小二乘法拟合任意次曲线(C#)...
  11. Word论文排版之样式的使用
  12. Kubernetes监控:Dashbaord 2.0.0部署方式
  13. Mov文件字幕添加与播放
  14. Web前端——JSP
  15. JAVA的continue用法
  16. 傅立叶级数和傅立叶变换是什么关系?
  17. 学会使用5W1H来写作博客
  18. 计算机公开课教学反思,公开课教学反思
  19. 【scala函数式编程】函数设计的通用结构——Monad
  20. 直布罗陀ICO规则着重市场驱动

热门文章

  1. 最小值最大化问题(贪心系列)
  2. php对接海康视频教程_手把手教你php对接海康api
  3. 【CF1354C1C2】Polygon Embedding(求解包含正多边形的最小正方形)
  4. 正态分布下贝叶斯决策的特例(二)
  5. 异步ajax动态实现级联,JQuery异步加载无限下拉框级联功能实现示例
  6. 2021-09-08因子分解机
  7. 2021-09-02最小栈
  8. Fizz Buzz @leetcode Math
  9. tinygrad ->要求python3.8以上
  10. 多个计算机之间触发事件,相互通信的一种方法----通过文件的办法