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

时间:2021-12-06 08:28:22

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就过不去了。
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
typedef double f2;
#define eps 1e-7
#define N 50050
int n,a[N],K,L,R,Q1[N],l1,r1,Q2[N],l2,r2,Q3[N],l3,r3;
f2 t[N];
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d%d",&n,&K,&L,&R);
int i;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
l1=r1=l2=r2=0;
for(i=1;i<L;i++) {
while(l1<r1&&a[Q1[r1-1]]>=a[i]) r1--;
while(l2<r2&&a[Q2[r2-1]]<=a[i]) r2--;
Q1[r1++]=Q2[r2++]=i;
}
f2 ans1=-1000;
for(i=L;i<=n;i++) {
while(l1<r1&&i-Q1[l1]>=L) l1++;
while(l2<r2&&i-Q2[l2]>=L) l2++;
while(l1<r1&&a[Q1[r1-1]]>=a[i]) r1--;
while(l2<r2&&a[Q2[r2-1]]<=a[i]) r2--;
Q1[r1++]=Q2[r2++]=i;
ans1=max(ans1,1.0*(a[Q2[l2]]-a[Q1[l1]])/(L-1+K));
}
f2 l=0,r=1000;
while(r-l>eps) {
f2 mid=(l+r)/2;
f2 re=-100000;
l3=r3=0;
for(i=1;i<=n;i++) t[i]=a[i]-i*mid;
for(i=L+1;i<=n;i++) {
while(l3<r3&&i-Q3[l3]>=R) l3++;
while(l3<r3&&t[Q3[r3-1]]>=t[i-L]) r3--;
Q3[r3++]=i-L; re=max(re,t[i]-t[Q3[l3]]);
}
l3=r3=0;
for(i=1;i<=n;i++) t[i]=a[i]+i*mid;
for(i=n-L;i;i--) {
while(l3<r3&&Q3[l3]-i>=R) l3++;
while(l3<r3&&t[Q3[r3-1]]>=t[i+L]) r3--;
Q3[r3++]=i+L; re=max(re,t[i]-t[Q3[l3]]);
}
if(re>=mid*K) l=mid;
else r=mid;
}
//printf("%.4f\n",ans1);
printf("%.4f\n",max(ans1,l));
}
}

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

  1. P6087 &lbrack;JSOI2015&rsqb;送礼物 01分数规划&plus;单调队列&plus;ST表

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

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

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

  3. &lbrack;BZOJ4476&rsqb; &lbrack;JSOI2015&rsqb; 送礼物 &lpar;01分数规划&plus;ST表&rpar;

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

  4. &lbrack;BZOJ4476&rsqb;&lbrack;JSOI2015&rsqb;送礼物&lbrack;分数规划&plus;单调队列&rsqb;

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

  5. BZOJ 5281--&lbrack;Usaco2018 Open&rsqb;Talent Show(分数规划&amp&semi;单调队列&amp&semi;DP)

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

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

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

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

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

  8. 【BZOJ4476】&lbrack;Jsoi2015&rsqb;送礼物 分数规划&plus;RMQ

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

  9. BZOJ&lowbar;4819&lowbar;&lbrack;Sdoi2017&rsqb;新生舞会&lowbar;01分数规划&plus;费用流

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

随机推荐

  1. tar 解压缩命令详解

    今天对目录及其文件进行压缩:/usr/local/test# tar -cvf /usr/local/auto_bak/test.tar /usr/local/test 仅打包,不压缩 # tar - ...

  2. open-flash-chart2

    链接 http://www.oschina.net/news/10797/Open-Flash-Chart-2-0 open-flash-chart.rar http://123-reg-suspen ...

  3. 纯CSS下拉导航菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="h ...

  4. 生活科技两相宜:(一)Win7使用微软SkyDrive网盘简易教程

    今天得写一个Win7使用微软SkyDrive网盘的简易教程,主要是给我老婆看,顺便贴出来给大家共享一下:)    使用微软SkyDrive网盘有两个层次.一个是使用网页版,这个跟使用163或者QQ网盘 ...

  5. PHP比你想象的好得多

    有很多对于PHP的抱怨,甚至这些抱怨也出自很多聪明的人.当Jeff Atwood写下对于PHP的另一篇抱怨文章之后,我思考了下PHP的好的方面. 这些抱怨最大的问题是他们出自很多仍在使用旧版本PHP的 ...

  6. boost库----enable&lowbar;shared&lowbar;from&lowbar;this类的作用和实现原理

    使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...

  7. oracle日期格式化

    TO_CHAR(t.CAMERA_CREAT_TIME, 'YYYY-MM-DD HH24:MI:SS') as point_registerdate,TO_CHAR(t.CAMERA_MODIFY_ ...

  8. spring boot 之 spring task&lpar;定时任务&rpar;

    cron:通过表达式来配置任务执行时间cron表达式详解 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为: 秒(0~59)分钟(0~59)3 小时(0~23)4  天(0 ...

  9. Pycharm主题设置以及导入方式

    主题下载链接: http://www.themesmap.com/ pycharm -- 导入主题(theme) and 修改背景颜色(护眼色)   前情提要 众所周知,随着python语言的不断流行 ...

  10. Django简介及Django项目的创建详述

    Django简介 Django是一个开源的Web应用框架,由Python写成.但是,百度百科中讲它采用了MVC框架模式,其实这个解释不准确. 确切的讲,Django的模式是:路由控制+MTV模式.所谓 ...