BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

Description

JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物。
萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻
的礼物之间有一种神秘的美感。于是,JYY决定从中挑选连续的一些礼物,但究
竟选哪些呢?
【问题描述】
假设礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第i
1< =i< =N个位置的礼物美观度为正整数Ai,。JYY决定选出其中连续的一段,
即编号为礼物i,i+1,…,j-1,j的礼物。选出这些礼物的美观程度定义为
(M(i,j)-m(i,j))/(j-i+k)
其中M(i,j)表示max{Ai,Ai+1....Aj},m(i,j)表示min{Ai,Ai+1....Aj},K为给定的正整数。
由于不能显得太小气,所以JYY所选礼物的件数最少为L件;同时,选得太
多也不好拿,因此礼物最多选R件。JYY应该如何选择,才能得到最大的美观程
度?由于礼物实在太多挑花眼,JYY打算把这个问题交给会编程的你。

Input

本题每个测试点有多组数据。输入第一行包含一个正整数T(T< =10),表示
有T组数据。
每组数据包含两行,第一行四个非负整数N,K,L,R(2< =L< =R< =N。第二行
包含N个正整数,依次表示A1,A2....An,(Ai< =10^8),N,K< = 50,000

Output

输出T行,每行一个非负实数,依次对应每组数据的答案,数据保证答案不
会超过10^3。输出四舍五入保留4位小数。

Sample Input

1
5 1 2 4
1 2 3 4 5

Sample Output

0.7500

可以发现一定是最大值和最小值都在两端时最优,但可能长度超出限制。
答案可能由两部分组成:1.长度为L 2.最大值和最小值在两端。
第一种情况直接维护个单调栈即可。
第二种情况是个经典的01分数规划。
二分答案x
有$a[l]-a[r]>(r-l+k)*$x或$a[r]-a[l]>(r-l+k)*x$
分别求$(a[l]+l*x)-(a[r]+r*x)$和$(a[l]-l*x)-(a[r]-r*x)$的最大值,用单调队列求即可,多个log就过不去了。
 
代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <stdlib.h>
  5. using namespace std;
  6. typedef double f2;
  7. #define eps 1e-7
  8. #define N 50050
  9. int n,a[N],K,L,R,Q1[N],l1,r1,Q2[N],l2,r2,Q3[N],l3,r3;
  10. f2 t[N];
  11. int main() {
  12. int T;
  13. scanf("%d",&T);
  14. while(T--) {
  15. scanf("%d%d%d%d",&n,&K,&L,&R);
  16. int i;
  17. for(i=1;i<=n;i++) scanf("%d",&a[i]);
  18. l1=r1=l2=r2=0;
  19. for(i=1;i<L;i++) {
  20. while(l1<r1&&a[Q1[r1-1]]>=a[i]) r1--;
  21. while(l2<r2&&a[Q2[r2-1]]<=a[i]) r2--;
  22. Q1[r1++]=Q2[r2++]=i;
  23. }
  24. f2 ans1=-1000;
  25. for(i=L;i<=n;i++) {
  26. while(l1<r1&&i-Q1[l1]>=L) l1++;
  27. while(l2<r2&&i-Q2[l2]>=L) l2++;
  28. while(l1<r1&&a[Q1[r1-1]]>=a[i]) r1--;
  29. while(l2<r2&&a[Q2[r2-1]]<=a[i]) r2--;
  30. Q1[r1++]=Q2[r2++]=i;
  31. ans1=max(ans1,1.0*(a[Q2[l2]]-a[Q1[l1]])/(L-1+K));
  32. }
  33. f2 l=0,r=1000;
  34. while(r-l>eps) {
  35. f2 mid=(l+r)/2;
  36. f2 re=-100000;
  37. l3=r3=0;
  38. for(i=1;i<=n;i++) t[i]=a[i]-i*mid;
  39. for(i=L+1;i<=n;i++) {
  40. while(l3<r3&&i-Q3[l3]>=R) l3++;
  41. while(l3<r3&&t[Q3[r3-1]]>=t[i-L]) r3--;
  42. Q3[r3++]=i-L; re=max(re,t[i]-t[Q3[l3]]);
  43. }
  44. l3=r3=0;
  45. for(i=1;i<=n;i++) t[i]=a[i]+i*mid;
  46. for(i=n-L;i;i--) {
  47. while(l3<r3&&Q3[l3]-i>=R) l3++;
  48. while(l3<r3&&t[Q3[r3-1]]>=t[i+L]) r3--;
  49. Q3[r3++]=i+L; re=max(re,t[i]-t[Q3[l3]]);
  50. }
  51. if(re>=mid*K) l=mid;
  52. else r=mid;
  53. }
  54. //printf("%.4f\n",ans1);
  55. printf("%.4f\n",max(ans1,l));
  56. }
  57. }

BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列的更多相关文章

  1. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  2. BZOJ4476 JSOI2015送礼物(分数规划+单调队列)

    看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...

  3. [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表)

    [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表) 题面 给出n,k,l,r和序列a,要求从a中选一段连续的区间[i,j]出来,使得M(i,j)-m(i,j)/(j-i+k) ...

  4. [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]

    题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...

  5. BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 79  Solved: 58[Sub ...

  6. 【BZOJ3316】JC loves Mkk 分数规划+单调队列

    [BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整 ...

  7. 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列

    单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...

  8. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ

    [BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...

  9. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

随机推荐

  1. SQL中内连接和外连接的问题!

    本文系转载,版权归原作者所有. 如表      -------------------------------------------------      table1 | table2 |    ...

  2. Web前端文件上传进度的显示

    跟后台关系不大,主要是前端js实现,具体使用了XMLHttpRequest的ProgressEvent事件,可以参考MDN中的Using XMLHttpRequest https://develope ...

  3. Terminating app due to uncaught exception 'CALayerInvalid', reason: 'layer <CALayer: 0x7fda42c66e30> is a part of cycle in its layer tree'

    iOS App里面所有的View构成一个组件树,这个树里面如果有了闭环就会出现这个报错,最常见的你不小在某UIViewController里面写了这样的代码: someView.addSubView( ...

  4. golang 二进制转十进制实现方式

    golang 二进制转十进制实现方式 直接上代码 package main import ( "fmt" "math" ) func StringToIntAr ...

  5. 用一张表里的记录更新自己(或另一张表)里的记录(exists使用)

    update jqhdzt set shid=(select shid from v_plat_userjqinfo t where jqhdzt.jqbh=t.JQBH and jqhdzt.shi ...

  6. java基础语法3

    逻辑运算符 &:与,和有共同的,必须条件都满足才是true 有false就返回false,必须都是true才返回true |:或者,其中有一个满足条件就返回true ^亦或,相同是false, ...

  7. Java容器:Stack,Queue,PriorityQueue和BlockingQueue

    Stack Queue PriorityQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue ...

  8. PCB布线要求

    时钟线要求 时钟驱动器布局在PCB中心而非电路板外围,布局尽量靠近,走线圆滑.短,非直角.非T形,布线可选4~8mil,过窄会导致高频信号衰减,并降低信号之间电容性耦合. 避免时钟之间.与信号之间的干 ...

  9. CSS定位使用方法

    .box0 { width: 200px; height: 200px; position: relative; background: #cfa } .box0-1,.box0-2 { width: ...

  10. .NET之IOC控制反转运用

    当前场景: 如果有不同的用户.使用同一个系统.而不同的客户有某些不同的需求.在不改变系统主体的情况下,可以直接使用IOC控制反转依赖搭建项目 1.添加接口层 目前里面只有一个会员的类.里面有一个登录接 ...