这道题真是有趣呀。

其实就是一个分数规划问题,用一个二分加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 送礼物的更多相关文章

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

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

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

  3. JSOI 2015 送礼物

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

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

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

  5. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  6. P1340 送礼物

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...

  7. [TYVJ2340] 送礼物 - 双向搜索

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到 ...

  8. TYVJ1340 送礼物

    P1340 送礼物 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后 ...

  9. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

随机推荐

  1. 富文本编辑器 summernote.js

    1.引用js  可在 https://summernote.org/ 官网下载 ,并查看详细的API  引入:summernote.js 和 summernote-zh-CN.js 以及样式文件:su ...

  2. Java源码解析——集合框架(四)——LinkedListLinkedList原码分析

    LinkedList源码分析 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...

  3. Kubernetes-创建集群(四)

    Kubernetes可以运行在多种平台,从笔记本到云服务商的虚拟机,再到机架上的裸机服务器.要创建一个Kubernetes集群,根据不同的场景需要做的也不尽相同,可能是运行一条命令,也可能是配置自己定 ...

  4. 【EXCEL】SUMIF(条件を指定して数値を合計する)

    Mirocrosoft Excel

  5. ABAP CDS ON HANA-(4)ヘッダー行編集

    Explicit Name List use in CDS We create a simple  CDS View like below. @AbapCatalog.sqlViewName: ‘ZS ...

  6. Python: 列表的两种遍历方法

    方法一:以列表中元素的下标进行访问 def traverse1(list1): for i in range(len(list1)): print(list1[i], end=' ') print() ...

  7. 关于springboot 打包问题 jar包和 war包

    起因:项目开发完成   需要打包部署了  发现自己不会打包 那么开始网上学习打包? 那么怎么来打包那? 我们以前没有采用springboot 时候我们都是直接将项目打成war包形式  然后放到tomc ...

  8. web开发微信文章目录

    Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章.   ...

  9. scidb

    貌似是给科学家用的数据库,暂不研究

  10. 「暑期训练」「基础DP」 Piggy-Bank (HDU-1114)

    题意与分析 完全背包问题. 算法背包九讲里面都有提到过,我自己再说下对完全背包的理解. 为什么01背包中遍历状态从VV到00?考虑一下基本方程$dp[i][j]=max(dp[i-1][j-w[i]] ...