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 [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. 使用Puppeteer抓取受限网站

    不要相信前端是安全的,今天简单验证一下,但是希望大家支持正版,支持原作者,毕竟写书不易. 安装Puppteer npm install --save puppeteer 选择目标网站 我们这里选择胡子 ...

  2. kafka 集群

    在kafka中,我们能创建多种类型的集群,一般如下: 单节点——单个broker集群 单节点——多broker集群 多结点——多broker集群 kafka集群中主要有五个组件: Topic:主题主要 ...

  3. jquery中利用队列依次执行动画

    如果有5个隐藏的div,要让它们依次显示,通常的做法是要一个一个嵌套在回调函数里面,这样导致代码看起来非常不直观. $("#div1").slideDown(1000,functi ...

  4. JavaScript高级程序设计(一)

    一.三种常见的著名的命名规则: 1.Camel(驼峰式命名):首字母是小写的,接下来的单词都以大写字母开头.例如:var  myTestValue=0; 2.Pascal(帕斯卡命名):首字母是大写的 ...

  5. invalid bound statement (not found)

    invalid bound statement (not found) mybatis 错误: 一般是Mapepr.xml文件中文nameapce没有和mapper接口发生映射,导致mybatis绑定 ...

  6. Java并发之ReentrantReadWriteLock

    上篇文章简单的介绍了ReentrantLock可重入锁.事实上我们可以理解可重入锁是一种排他锁,排他锁在同一个时刻只能够由一个线程进行访问.这就与我们实际使用过程中有点不想符合了,比如说当我们进行读写 ...

  7. 【转】关于Sentry

    1. Sentry介绍及使用 Sentry 是一个实时事件日志记录和汇集的平台.其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈. 备注:国内有同类型的产品Fundebug,提供网 ...

  8. PAT1028:List Sorting

    1028. List Sorting (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Excel ca ...

  9. Oracle 服务启动关闭

    有没有感觉到,自从装上Oracle之后,电脑变卡了?卡是正常的,oracle作为大型数据库软件,运行起来是非常吃内存的. 所以对于自用的电脑来说,不使用Oracle的时候,应该把Oracle的一系列服 ...

  10. springboot之启动原理解析

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...