区间的价值

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]) 为此长度的答案,我们可以发现他是可以更新到小于其长度的所有长度答案的
      
  1. #include<bits/stdc++.h>
  2. #define ll __int64
  3. using namespace std;
  4. ll f[][];
  5. ll a[];
  6. ll l[];
  7. ll r[];
  8. ll n;
  9. ll ans[];
  10. ll aa[];
  11. void rmq_init()
  12. {
  13. for(int j=;(<<j)<=n;j++)
  14. for(int i=;i+(<<(j))-<=n;i++)
  15. {
  16. f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
  17. }
  18. }
  19. int rmq(ll aa,ll bb)
  20. {
  21. ll k=;
  22. ll ans1;
  23. while((<<(k+))<=bb-aa+)
  24. k++;
  25. ans1=max(f[aa][k],f[bb-(<<k)+][k]);
  26. return ans1;
  27. }
  28.  
  29. int main()
  30. {
  31. while(scanf("%I64d",&n)!=EOF)
  32. {
  33. for(int i=;i<=n;i++)
  34. {
  35. scanf("%I64d",&a[i]);
  36. f[i][]=a[i];
  37. }
  38. rmq_init();
  39. a[]=-;
  40. a[n+]=-;
  41. l[]=;
  42. for(int i=;i<=n;i++)
  43. {
  44. int temp=i-;
  45. while(a[temp]>=a[i])
  46. temp=l[temp]-;
  47. l[i]=temp+;
  48. }
  49. r[n]=n;
  50. for(int i=n-;i>=;i--)
  51. {
  52. int temp=i+;
  53. while(a[temp]>=a[i])
  54. temp=r[temp]+;
  55. r[i]=temp-;
  56. }
  57. memset(ans,,sizeof(ans));
  58. memset(aa,,sizeof(aa));
  59. for(int i=;i<=n;i++)
  60. {
  61. ll mm=rmq(l[i],r[i]);
  62. ans[r[i]-l[i]+]=max(ans[r[i]-l[i]+],mm*a[i]);
  63. }
  64. for(int i=n;i>=;i--)
  65. aa[i]=max(ans[i],aa[i+]);
  66. for(int i=;i<=n;i++)
  67. printf("%I64d\n",aa[i]);
  68. }
  69. return ;
  70. }

HDU 5696 RMQ+滑窗的更多相关文章

  1. HDU 6319.Problem A. Ascending Rating-经典滑窗问题求最大值以及COUNT-单调队列 (2018 Multi-University Training Contest 3 1001)

    2018 Multi-University Training Contest 3 6319.Problem A. Ascending Rating 题意就是给你长度为k的数列,如果数列长度k<n ...

  2. 【10.7校内测试】【队列滑窗】【2-sat】【贪心+栈二分+线段树(noip模拟好题)】【生日祭!】

    比较好想的一道题,直接用队列滑窗,因为扫一遍往队列里加东西时,改变的只有一个值,开桶储存好就行了! #include<bits/stdc++.h> using namespace std; ...

  3. matlab核函数与滑窗

    在处理图像时,为了提取特征,经常用各种核函数和图像进行卷积,其实就是通过一个矩阵以滑窗的形式与原图像进行点乘求和,可以看作对一个像素和附近像素进行了加权平均. 比如经常用3x3的近似高斯卷积核 0 1 ...

  4. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...

  5. 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和

    程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K   在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币. ...

  6. [poj 3261]后缀数组+滑窗最小值

    题目链接:http://poj.org/problem?id=3261 这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小 ...

  7. UVA 1619/POJ2796 滑窗算法/维护一个单调栈

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12409   Accepted: 3484 Case T ...

  8. 集训第四周(高效算法设计)K题 (滑窗问题)

    UVA 11572 唯一的雪花 题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新 方法一: #include& ...

  9. TCP的可靠传输机制(简单好理解:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制)

    TCP的几大模块:分段与流,滑窗,连接,流量控制,重新发送,堵塞控制. 1.checksum:在发送TCP报文的时候,里面的信息可能会因为环境的问题,发送变化,这时,接收信号的时候就需要通过check ...

随机推荐

  1. PAT (Advanced Level) Practise - 1095. Cars on Campus (30)

    http://www.patest.cn/contests/pat-a-practise/1095 Zhejiang University has 6 campuses and a lot of ga ...

  2. Bootstrap 历练实例 - 按钮(Button)插件复选框

    复选框(Checkbox) 您可以创建复选框按钮 组,并通过向 btn-group 添加 data 属性 data-toggle="buttons" 来添加复选框按钮组的切换. & ...

  3. java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

    package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...

  4. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg

    package com.swift; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; i ...

  5. 20180909 解析JS Cookie的设置,获取和检索

    引用: JavaScript Cookie - by runoob.com Cookie是储存在电脑文本文件中的数据,用于保存访问者的信息,并可以在下次打开页面时引用. 页面在设置/引用访问者信息时, ...

  6. 可拖拽div

    在开发的时候需要一个可拖拽的prompt弹框.自己写了一个,大概思路为: 1.获取鼠标左键按下移动的起点坐标(x,y). 2.获取div的left和top属性. 3.得到鼠标坐标到左上角的距离(x-t ...

  7. 进入docker容器并执行命令的的3中方法

    进入docker容器并执行命令的的3中方法 docker exec   nsenter   docker attach "container" 建议使用nsenter, exec有 ...

  8. vue.js 独立引用css文件图片路径错误

    vue的环境是用vue-cli,写在vue文件的图片引用build之后的路径都没什么问题 但是有的时候我们会有一些公共的css文件单独的放在assets目录下 如下图所示 这里当build后发现写在c ...

  9. vue之神奇的动态按钮

    今天我们将利用vue的条件指令来完成一个简易的动态变色功能按钮 首先我们还是要对vue进行配置,在上篇随笔中有相关下载教学. 然后我们要在html页面上搭建三个简易的按钮,颜色分别为紫,绿和蓝(颜色随 ...

  10. python练手习题

    不断记录python常见习题,不断寻求更多更好的解决办法.持续更新中..... 练习: 1. list两两元素交换位置,如[1,2,3,4,5,6] 执行后为 -> [2,1,4,3,6,5] ...