【BZOJ4476&JSOI2015】送礼物(二分,RMQ)

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)的更多相关文章
- [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) ...
- luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性
LINK:送礼物 原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30. 以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉. 能过的\ ...
- bzoj4476 [Jsoi2015]送礼物
化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
- [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...
- 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
[BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...
- BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列
BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...
- P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...
- 送礼物(二分加双向DFS)
题目链接 题意:给你n个礼物重量,给你一个M力量,看你一次性搬动不超过M的礼物重量. 思路:看似背包,但M太大.所以要用DFS,但n也有45,所以考虑双向DFS先搜前半部分满足情况的所有重量,然后去重 ...
- JSOI 2015 送礼物
[BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...
随机推荐
- 【前端_js】js中数字字符串之间的比较
js中字符串间的比较是按照位次优先,比较各字符的ASCII大小,包括数字字符串之间的比较. 1.console.log("1"<"3");//true 2 ...
- 自动化运维工具——ansible剧本playbook(三)
一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...
- spring MVC体系结构和请求控制器
MVC处理过程 spring MVC架构模式都进行了分层设计如下 数据访问接口:DAO层 处理业务逻辑层:service层 数据实体:POJO 负责前端请求的接受并处理:servlet 负责前端页面展 ...
- 服务器常说的U是什么意思?
U是英文单词:unit 所说的1U和2U,是服务器的厚度,1U大概是相当于机柜的两个小格子,2U是四个格子.1U大概是4.45厘米(1U=1.75英寸,1英寸=2.54CM).以下这个是图片:
- 江西理工大学编程俱乐部 2328 Star
: Star 时间限制: C/C++ s Java/Python s 内存限制: MB 答案正确: 提交: 题目描述 31世纪,人类世界的科技已经发展到了空前的高度,星际移民,星际旅游早已经不再是问题 ...
- SQLite学习和使用
创建数据库并创建表格 1.创建MyDatabaseHelper继承于SQLiteOpenHelper(抽象类,必须实现onCreate()和onUpgrade()方法)2.把数据库建表指令弄成一个字符 ...
- Docker背后的内核知识(一)
Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...
- IOS开发---菜鸟学习之路--(二十四)-iOS7View被导航栏遮挡问题的解决
(此文为复制帖,原文地址为:http://blog.sina.com.cn/s/blog_a8192bdd0101af40.html) self.navigationController.naviga ...
- linux环境搭建系列之memcached安装步骤
1.从官网在线下载最新的安装包 wget http://memcached.org/downloads/memcached-1.4.34.tar.gz 该命令为在线下载 注意:最新的地址会变动,所以最 ...
- python 笔试总结
1.对比两种函数对应结果 def fn(x): if x>0: print(x) fn(x-1) ****结果****** 3 2 1 $$$$$$另外一种$$$$$$$$$ def fn(x) ...