区间的价值

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 844    Accepted Submission(s): 398

Problem Description
我们定义“区间的价值”为一段区间的最大值*最小值。

一个区间左端点在L

,右端点在R

,那么该区间的长度为(R−L+1)

现在聪明的杰西想要知道,对于长度为k

的区间,最大价值的区间价值是多少。

当然,由于这个问题过于简单。

我们肯定得加强一下。

我们想要知道的是,对于长度为1∼n

的区间,最大价值的区间价值分别是多少。

样例解释:

长度为1

的最优区间为2−2

答案为6∗6

长度为2

的最优区间为4−5

答案为4∗4

长度为3

的最优区间为2−4

答案为2∗6

长度为4

的最优区间为2−5

答案为2∗6

长度为5的最优区间为1−5

答案为1∗6

 
Input
多组测试数据

第一行一个数n(1≤n≤100000)

第二行n

个正整数(1≤ai≤109)

,下标从1

开始。

由于某种不可抗力,ai

的值将会是1∼109

内<b style="color:red;">随机产生</b>的一个数。(除了样例)

 
Output
输出共n

行,第i

行表示区间长度为i

的区间中最大的区间价值。

 
Sample Input
5
1 6 2 4 4
 
Sample Output
36
16
12
12
6
 
Source
 
题意:中文题面  求长度为i 的区间中最大的区间价值。区间价值=区间最小值*区间最大值
 
题解:1.RMQ 记录每个区间的最大值
         2.滑窗处理以a[i]为最小值的左右边界
         3.那么对于 一个答案 a[i]*rmq(l[i],r[i]) 为此长度的答案,我们可以发现他是可以更新到小于其长度的所有长度答案的
      
 #include<bits/stdc++.h>
#define ll __int64
using namespace std;
ll f[][];
ll a[];
ll l[];
ll r[];
ll n;
ll ans[];
ll aa[];
void rmq_init()
{
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<(j))-<=n;i++)
{
f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
}
}
int rmq(ll aa,ll bb)
{
ll k=;
ll ans1;
while((<<(k+))<=bb-aa+)
k++;
ans1=max(f[aa][k],f[bb-(<<k)+][k]);
return ans1;
} int main()
{
while(scanf("%I64d",&n)!=EOF)
{
for(int i=;i<=n;i++)
{
scanf("%I64d",&a[i]);
f[i][]=a[i];
}
rmq_init();
a[]=-;
a[n+]=-;
l[]=;
for(int i=;i<=n;i++)
{
int temp=i-;
while(a[temp]>=a[i])
temp=l[temp]-;
l[i]=temp+;
}
r[n]=n;
for(int i=n-;i>=;i--)
{
int temp=i+;
while(a[temp]>=a[i])
temp=r[temp]+;
r[i]=temp-;
}
memset(ans,,sizeof(ans));
memset(aa,,sizeof(aa));
for(int i=;i<=n;i++)
{
ll mm=rmq(l[i],r[i]);
ans[r[i]-l[i]+]=max(ans[r[i]-l[i]+],mm*a[i]);
}
for(int i=n;i>=;i--)
aa[i]=max(ans[i],aa[i+]);
for(int i=;i<=n;i++)
printf("%I64d\n",aa[i]);
}
return ;
}

最新文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-06虚拟方向键(五)绘制方向键箭头
  2. PowerDesigner导出Report通用报表
  3. r-cnn学习(四):train_faster_rcnn_alt_opt.py源码学习
  4. How Garbage Collection Really Works
  5. PHP中的一个”坑“
  6. 面向对象的ExtJS场景开发
  7. kafka安装及常用命令
  8. 读取XML
  9. hdu 4588 Count The Carries
  10. hdu 1116
  11. Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的
  12. SQL中Merge的用法
  13. SQL server sysobjects表说明
  14. 9,EasyNetQ-版本化消息
  15. 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放
  16. WinRAR 5.40 &amp; 4.20 &amp; 3.93 的注册码 - rarreg.key
  17. Java解析property文件(和静哥说的,SQL执行限定时间写在xml中,增加扩展,在不改源代码基础上)
  18. linux配置路径PATH问题
  19. javaEE-EJB学习笔记
  20. [vim]乱码问题

热门文章

  1. 《GPU高性能编程CUDA实战中文》中第四章的julia实验
  2. 关于union的一些问题
  3. Centos 安装python 3.7 ,同时兼容python2.7
  4. python笔记-for循环的方法
  5. Mybatis中的增删改查
  6. JZOJ 5773. 【NOIP2008模拟】简单数学题
  7. &lt;Docker学习&gt;1. 简介
  8. GoF23种设计模式之创建型模式之建造者模式
  9. 用描述符实现缓存功能和property实现原理
  10. SOA:面向服务编程——竹子整理