化简式子

$M>=m+ans*(r-l+k)$

发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$,

右面都确定了,但最大值仍然有两种情况,一是最大值就在要求的区间内,二是在要求的区间右侧,

对于第一种情况,直接把每个点的val扔进单调队列就可以了,第二种呢,因为要求区间长度最小,所以左端点即为$r-L+1$,单调队列维护$i-L+1~i$的最大值即可,

左端点为最小值也一样。

而且不需要判断在我们选的区间内是否有比$a[i]$更小的,因为那一定比这优,考虑过,

所以每次check直接正反扫就好了。

2017.11.7更新

原程序被hack,因为如果只能全选的话,最小值又不在两边,就不会枚举到最优解,所以强行往两侧各添加n个0即可。

代码已更正,可放心食用

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 150050
#define eps 1e-6
using namespace std;
int n,l,r,k;
int a[N];
double val[N];
int q1[N],q2[N],head1,head2,tail1,tail2;
bool check(double x){
head1=head2=;
tail1=tail2=;
for(int i=;i<=*n;i++){
int pos=i-l+;
double now=-;
if(pos>){
val[pos]=a[pos]+x*pos;
while(head1<=tail1&&val[pos]>val[q1[tail1]])tail1--;
q1[++tail1]=pos;
while(head1<=tail1&&q1[head1]<=i-r)head1++;
now=max(now,val[q1[head1]]);
}
while(head2<=tail2&&a[i]>a[q2[tail2]])tail2--;
q2[++tail2]=i;
while(head2<=tail2&&q2[head2]<=i-l)head2++;
if(i>n&&pos>){
now=max(now,a[q2[head2]]+x*(i-l+));
if(now>=a[i]+x*(i+k))return ;
}
}
head1=head2=;
tail1=tail2=;
for(int i=*n;i>=n+;i--){
int pos=i+l-;
double now=-;
if(pos<=*n){
val[pos]=a[pos]-x*pos;
while(head1<=tail1&&val[pos]>val[q1[tail1]])tail1--;
q1[++tail1]=pos;
while(head1<=tail1&&q1[head1]>=i+r)head1++;
now=max(now,val[q1[head1]]);
}
while(head2<=tail2&&a[i]>a[q2[tail2]])tail2--;
q2[++tail2]=i;
while(head2<=tail2&&q2[head2]>=i+l)head2++;
if(i<=*n&&pos<=*n){
now=max(now,a[q2[head2]]-x*(i+l-));
if(now>=a[i]-x*(i-k))return ;
}
}
return ;
}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&n,&k,&l,&r);
for(int i=n+;i<=*n;i++)scanf("%d",&a[i]);
double L=,R=,M;
while(L+eps<R){
M=(L+R)/2.0;
if(check(M))L=M;
else R=M;
}
printf("%0.4lf\n",M);
}
return ;
}

bzoj4476

bzoj4476 [Jsoi2015]送礼物的更多相关文章

  1. [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) ...

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

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

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

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

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

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

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

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

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

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

  7. luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性

    LINK:送礼物 原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30. 以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉. 能过的\ ...

  8. JSOI 2015 送礼物

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

  9. 「JSOI2015」送礼物

    「JSOI2015」送礼物 传送门 看到这题首先想到分数规划. 我们发现对于当前区间,如果它的最大值和最小值不是分居区间的两个端点的话,那么我们显然可以把两端多出去的部分舍掉,因为,在区间最大值最小值 ...

随机推荐

  1. 《转》xcode创建一个工程的多个taget,便于测试和发布多个版本

    背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块 ...

  2. 完整的treeview菜单实例

    以下是我用treeview控件按部门和员工显示设备领用情况代码. Option Compare Database    Dim rec As New ADODB.Recordset    Dim re ...

  3. 无效类字符串:ProgID: Excel.Application

    网上发现的方案是改注册表,其实用不着那么麻烦,找2种excel文件:xlsx和xls,把默认打开方式都换成你机器上有的程序就行,比如WPS Office的WPS 表格

  4. ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

    官方已经给出解决方案:https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension- ...

  5. ubuntu 13.10 install wireshark

    ubuntu 13.10 install wireshark 今天在使用java jsoup操作remote server的是否,在本地执行可以成功返回内容,然后打成jar包,使用shell在 ser ...

  6. 华为专家谈CMDB建设

    CMDB成功的关键因素 对于CMDB项目的失败,普遍的解释是:没有数据的消费场景.工具和技术不行.流程管控不足. 从我自身的实践来看,我对此是有不同看法的.上述原因的确会影响人们使用CMDB,严重时甚 ...

  7. ccf 目录格式转换

    任务背景: 在网络上获取的ccf目录的格式是PDF,但是要进行数据分析时,PDF格式的数据是不符合要求的,因此需要将pdf格式转化为excel格式 任务目的: 将pdf格式的CCF目录转化为excel ...

  8. ElasticSearch Index 速度优化 (官方翻译)

    使用Bulk请求进行Index Bulk请求将产生比单文档index请求有更好的性能.至于Bulk请求中文档数量的大小,建议使用单一节点单一分片进行测试,先试试看100个,然后200个,然后400这样 ...

  9. Unity3d Mecanim动画系统Animator学习笔记

    1. unity3d Mecanim学习  Unity3d新版动画系统网上的介绍很多,但多是流水笔记,外人很难看明白,后来我 终于找到介绍的比较明白的两个作者,特别感谢.一个是58开发网的乐天老师,课 ...

  10. 想要薪资20-30K,Python程序员认真敲代码就够了!

    在这个年代,互联网的飞速壮大大家有目共睹,除了表露出的公共受益,其中计算机编程者也是做出了巨大的贡献,即使外国编程语言仍旧属于领导者,但是在互联网的壮大下,我们这是"地球村",国内 ...