BZOJ4476 送礼物
这道题真是有趣呀。
其实就是一个分数规划问题,用一个二分加log来得去掉分母。
分四种情况讨论
1.lenth > L && num ( max ) > num ( min )
2.lenth > L && num ( max ) < num ( min )
3.lenth == L && num ( max ) > num ( min )
4.lenth == L && num ( max ) < num ( min )
1,2种情况中最大值与最小值一定在选择序列两端,设左右端点编号为i,j
1. ( Vi - Vj ) / ( i - j + k ) = ans -> ( Vi - i * ans ) - ( Vj - j * ans ) = k * ans
二分ans并check左式最大值是否大于右式
2.( Vj - Vi ) / ( i - j + k ) = ans -> ( Vj + j * ans ) - ( Vi + i * ans ) = k * ans
同情况1
3,4用单调队列for一遍就可以了
#include<cstdio>
#include<algorithm>
#include<cassert>
//#define DEBUG
using namespace std ; const int MAXN = * + ;
int N , K , L , R ;
long long a [ MAXN ] ;
int p [ MAXN ] ; template < class T1 , class T2 >
void max_equal ( T1 & a , const T2 & b ) {
if ( a < b ) a = b ;
} double solve1 ( const double M ) {
#define f(i) (a[i]-M*(i))
double ans = -1e9 ;
int l = , r = - ;
for ( int i = L ; i <= N ; ++ i ) {
while ( r - l + >= && i - p [ l ] + > R ) ++ l ;
while ( r - l + >= && ! ( f ( p [ r ] ) < f ( i - L + ) ) ) -- r ;
p [ ++ r ] = i - L + ;
max_equal ( ans , f ( i ) - f ( p [ l ] ) ) ;
}
return ans ;
#undef f
} double Solve1 () {
double L = , R = 1e4 ;
while ( R - L >= 1e- ) {
const double M = ( L + R ) / ;
if ( solve1 ( M ) >= K * M ) L = M ;
else R = M ;
}
return ( L + R ) / ;
} double solve2 ( const double M ) {
#define f(i) (a[i]+M*(i))
double ans = -1e9 ;
int l = , r = - ;
for ( int i = L ; i <= N ; ++ i ) {
while ( r - l + >= && i - p [ l ] + > R ) ++ l ;
while ( r - l + >= && ! ( f ( p [ r ] ) > f ( i - L + ) ) ) -- r ;
p [ ++ r ] = i - L + ;
max_equal ( ans , f ( p [ l ] ) - f ( i ) ) ;
}
return ans ;
#undef f
} double Solve2 () {
double L = , R = 1e4 ;
while ( R - L >= 1e- ) {
const double M = ( L + R ) / ;
if ( solve2 ( M ) >= K * M ) L = M ;
else R = M ;
}
return ( L + R ) / ;
} double Solve3 () {
double ans = -1e9;
int l = , r = - ;
for ( int i = ; i <= N ; ++ i ) {
while ( r - l + >= && i - p [ l ] + > L ) ++ l ;
while ( r - l + >= && ! ( a [ p [ r ] ] < a [ i ] ) ) -- r ;
p [ ++ r ] = i ;
max_equal ( ans , a [ i ] - a [ p [ l ] ] ) ;
}
return ans / ( L - + K ) ;
} double Solve4 () {
double ans = -1e9;
int l = , r = - ;
for ( int i = ; i <= N ; ++ i ) {
while ( r - l + >= && i - p [ l ] + > L ) ++ l ;
while ( r - l + >= && ! ( a [ p [ r ] ] > a [ i ] ) ) -- r ;
p [ ++ r ] = i ;
max_equal ( ans , a [ p [ l ] ] - a [ i ] ) ;
}
return ans / ( L - + K ) ;
} double solve () {
scanf ( "%d%d%d%d" , & N , & K , & L , & R ) ;
for ( int i = ; i <= N ; ++ i ) scanf ( "%lld" , & a [ i ] ) ;
return max ( max ( Solve1 () , Solve2 () ) , max ( Solve3 () , Solve4 () ) ) ;
} int main () {
int T ;
scanf ( "%d" , & T ) ;
while ( T -- ) printf ( "%.4lf\n" , solve () ) ;
return ;
}
BZOJ4476 送礼物的更多相关文章
- 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
[BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...
- [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) ...
- JSOI 2015 送礼物
[BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...
- BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列
BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...
- CH2401 送礼物(双向dfs)
CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...
- P1340 送礼物
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...
- [TYVJ2340] 送礼物 - 双向搜索
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到 ...
- TYVJ1340 送礼物
P1340 送礼物 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后 ...
- 「CH2401」送礼物 解题报告
CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...
随机推荐
- VULTR的VPS在centos的操作系统中出现网站无法访问 80端口被firewall禁止
导语:叶子在为一位客户配置web服务器环境的时候,出现网站不能访问的情况,但ping正常.客户的服务器是在VULTR上购买的VPS,安装的操作系统为centos 7.3.经过叶子的分析,认为是防火墙阻 ...
- linux下的shadow文件解释
/etc/shadow //用户密码文件登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 root:$1$202cb962ac59075b964b0 ...
- Python核心框架tornado的异步协程的2种方式
什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...
- ubuntu如何设置Python的版本
Ubuntu默认已经安装了Python的版本了,不过是Python2的版本. 我们安装好Python3想把他切换为系统默认的版本. sudo update-alternatives --config ...
- thinkphp5阿里大于短信接口
function autumn_sendsms($tel,$stype){ $pd_go=true; if($tel==''){ $msg='手机号不能为空'; $pd_go=false; } if( ...
- OMAPL多核异构通信驱动AD9833波形发生器-Notify组件
OMAPL多核异构通信驱动AD9833-Notify组件demo OMAPL多核通信有三个主要机制,Notify,MessageQ,RegionShare;这里主要利用了Notify机制进行通信控制. ...
- [转]Makefile中使用$$的使用
在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢,区别大了.不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和s ...
- 常用数字信号的产生(C实现)-ARMA模型数据生成
ARMA模型属于信号现代谱估计的范畴,AR模型常用于信号的线性预测.AR模型最后归结为线性方程,MA最后为非线性方程,因此,AR模型使用较多. AR模型最后归结为解Yule-Walker方程,对应矩阵 ...
- java第二章 变量和运算符
Java 基础应用编程—— 变量和运算符 1.Java程序结构 数据类型:确定要存储在内存中的数据的类型. 变量:是存储数据的基本单元 2.变量的概念 变 ...
- 对C语言连等式的学习
例子如下 [pgsql@localhost soft]$ cat test1.c #include <stdlib.h> #include <stdio.h> int main ...