ANS明显是有二分性的

二分答案,设二分值为b
M(i,j)−m(i,j)j−i+k>b

显然当l<长度<r时,一端是最小值,一端是最大值。

等于l或r的时候因为可能不满足以上性质,所以RMQ暴力O(nlogn)做。

a[i]−a[j]>b∗j−b∗i+b∗k 或 a[j]−a[i]>b∗j−b∗i+b∗k
那么
(a[i]+b∗i)−(a[j]+b∗j)>b∗k 或 (−a[i]+b∗i)−(−a[j]+b∗j)>b∗k

是一个单调队列的样子

 var f1,f2:array[..,..]of extended;
q:array[..]of longint;
a,e:array[..]of extended;
mi:array[..]of int64;
log:array[..]of longint;
cas,i,v,j:longint;
n,l1,r1,lg:int64;
l,r,mid,k:extended; function max(x,y:extended):extended;
begin
if x>y then exit(x);
exit(y);
end; function min(x,y:extended):extended;
begin
if x<y then exit(x);
exit(y);
end; function querymin(x,y:longint):extended;
var len:longint;
begin
len:=log[y-x+];
exit(min(f1[x,len],f1[y-mi[len]+,len]));
end; function querymax(x,y:longint):extended;
var len:longint;
begin
len:=log[y-x+];
exit(max(f2[x,len],f2[y-mi[len]+,len]));
end; procedure build1;
var i,j:longint;
begin
for i:= to lg do
for j:= to n-mi[i]+ do f1[j,i]:=min(f1[j,i-],f1[j+mi[i-],i-]);
end; procedure build2;
var i,j:longint;
begin
for i:= to lg do
for j:= to n-mi[i]+ do f2[j,i]:=max(f2[j,i-],f2[j+mi[i-],i-]);
end; function isok(b:extended):boolean;
var h,w,i:longint;
begin
for i:= to n do e[i]:=a[i]+b*i;
h:=; w:=;
q[]:=n;
for i:=n-l1+ downto do
begin
while (h<=w)and(q[h]>i+r1-) do inc(h);
if e[i]-e[q[h]]>=b*k then exit(true);
while (h<=w)and(e[q[w]]>=e[i+l1-]) do dec(w);
inc(w); q[w]:=i+l1-;
end;
for i:= to n do e[i]:=-a[i]+b*i;
h:=; w:=;
q[]:=n;
for i:=n-l1+ downto do
begin
while (h<=w)and(q[h]>i+r1-) do inc(h);
if e[i]-e[q[h]]>=b*k then exit(true);
while (h<=w)and(e[q[w]]>=e[i+l1-]) do dec(w);
inc(w); q[w]:=i+l1-;
end;
exit(false);
end; begin
assign(input,'gift.in'); reset(input);
assign(output,'gift.out'); rewrite(output);
readln(cas);
mi[]:=;
for i:= to do mi[i]:=mi[i-]*;
for i:= to do
for j:=mi[i] to mi[i+]- do log[j]:=i;
for v:= to cas do
begin
readln(n,k,l1,r1);
for i:= to n do read(a[i]);
l:=; r:=;
for i:= to n do
begin
f1[i,]:=a[i];
f2[i,]:=a[i];
end;
lg:=log[r1];
build1; build2;
for i:= to n-l1+ do l:=max(l,(querymax(i,i+l1-)-querymin(i,i+l1-))/(l1-+k));
for i:= to n-r1+ do l:=max(l,(querymax(i,i+r1-)-querymin(i,i+r1-))/(r1-+k));
l1:=l1+; r1:=r1-;
if l1<=r1 then
while r-l>1e-6 do
begin
mid:=(r+l)/;
if isok(mid) then l:=mid
else r:=mid;
end;
writeln(l::);
end;
close(input);
close(output);
end.

【BZOJ4476&JSOI2015】送礼物(二分,RMQ)的更多相关文章

  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. luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性

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

  3. bzoj4476 [Jsoi2015]送礼物

    化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...

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

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

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

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

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

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

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

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

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

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

  9. 送礼物(二分加双向DFS)

    题目链接 题意:给你n个礼物重量,给你一个M力量,看你一次性搬动不超过M的礼物重量. 思路:看似背包,但M太大.所以要用DFS,但n也有45,所以考虑双向DFS先搜前半部分满足情况的所有重量,然后去重 ...

  10. JSOI 2015 送礼物

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

随机推荐

  1. Sum All Odd Fibonacci Numbers-freecodecamp算法题目

    Sum All Odd Fibonacci Numbers 1.要求 给一个正整数num,返回小于或等于num的斐波纳契奇数之和. 斐波纳契数列中的前几个数字是 1.1.2.3.5 和 8,随后的每一 ...

  2. Python_三级目录

    程序要求: 1. 使用字典存储 1. 可以一层一层的进入到所有层2. 可以在每层返回上一层3. 可以在任意层退出 三级目录写了两个版本,第一个版本是刚看完字典写出来的,代码很多冗余,很多重复. men ...

  3. Python知识点入门笔记——基本控制流程

    复合赋值语句 在Python中,可以使用一次赋值符号,给多个变量同时赋值:                  划重点:age_1,age_2 = age_2,age_1这种操作是Python独有的 i ...

  4. 使用shell脚本添加用户

    该文演示如何使用shell脚本完成添加用户,首先进行一个判断,如果用户存在,提示该用户已经存在,否则进行添加新的用户. 示例代码如下: #!/bin/bash grep_user() { R=`gre ...

  5. Java堆内存又溢出了!教你一招必杀技

    JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...

  6. BFS:HDU-1072-Nightmare

    Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  7. Kinect安装

    在连接kinect机器前,需要先安装两个软件,而在安装这两个软件前需要有vs2010(专业版本和快速版),因为需要包含.net framework 4.0 kinect sdk http://www. ...

  8. OpenCV学习笔记(八) 边缘、线与圆的检测

    边缘检测 对图像进行边缘检测之前,一般都需要先进行降噪(可调用GaussianBlur函数). Sobel算子 与 Scharr算子 都是一个离散微分算子 (discrete differentiat ...

  9. OpenCV学习笔记(六) 滤波器 形态学操作(腐蚀、膨胀等)

    转自:OpenCV 教程 另附:计算机视觉:算法与应用(2012),Learning OpenCV(2009) 平滑图像:滤波器 平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法.平滑处理的 ...

  10. 【Add Two Numbers】

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...