【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来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...
随机推荐
- 1503: [NOI2004]郁闷的出纳员
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13723 Solved: 4989[Submit][Status][Discuss] Descripti ...
- Mysql--子查询、分页查询、联合查询
一. 子查询的定义 出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句. 外部查询:select.inser ...
- LeetCode948-令牌放置
问题:令牌放置 你的初始能量为 P,初始分数为 0,只有一包令牌. 令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下: 如果你至少有 token[i] 点能量,可以将令牌 ...
- CentOS下安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64
因为服务器缺少php gd库,因为系统是centos,就是用yum去安装,一安装就报错如下: [root@iZ28sdxghs2Z ~]# yum install php-gd Loaded plug ...
- 指向class的指针使用方法实例
// pointer to classes example #include <iostream> using namespace std; class Rectangle { int w ...
- CSAPP 缓冲区溢出试验
缓冲区溢出试验是CSAPP课后试验之一,目的是: 更好的理解什么是缓冲区溢出 如何攻击带有缓冲区溢出漏洞的程序 如何编写出更加安全的代码 了解并理解编译器和操作系统为了让程序更加安全而提供的几种特性 ...
- hadoop完全分布式集群的搭建
集群配置: jdk1.8.0_161 hadoop-2.6.1 linux系统环境:Centos6.5 创建普通用户 dummy 准备三台虚拟机master,slave01,slave02 hado ...
- Spring Boot 要点--启动类和热部署
spring boot需要一个启动类 比如 package com.tianmaying; import org.springframework.boot.SpringApplication; imp ...
- 【Add Two Numbers】
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- Mac OS 添加 MySQL 环境变量
1.打开终端,输入: cd ~ 会进入~文件夹 2.如果 ~ 文件夹中已经存在 .bash_profile 文件,则在 : 后面追加你想要添加的路径, 3. 否则输入:touch .bash_prof ...