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的力气也异常的大(-_- ...
随机推荐
- VMware虚拟化NSX-Manager命令行更改admin用户密码
1.1 登录到NSX-Manager命令行界面,输入用户名和密码登录到用户模式 Log in to the vSphere Client and select an NSX virtual ap ...
- Linux环境下tomcat如何热部署
1.修改tomcat配置文件 1.1第一步修改tomcat-users.xml <role rolename="manager-gui" /> <role rol ...
- python学习之控制流2
配置环境:python 3.6 python编辑器:pycharm 代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- # 控制流语句: # if语句 ...
- MariaDB数据库服务
一.初始化mariaDB服务程序: yum install mariadb mariadb-server //安装mariaDB systemctl start mariadb ...
- 学习CSS
CSS教程 菜鸟教程 通过使用CSS我们可以大大提升网页开发的工作效率 什么是CSS? CSS指层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素 样式通常存储在 ...
- stm32--USB(作为U盘)+FatFs的实现
一.USB功能的添加(作为U盘) 添加文件 将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹: usb class为硬件相关(Library\Class): usb dri ...
- Windows2008新建域时Administrator 帐户密码不符合要求
Windows 2008 系统安装完毕后,(环境:在安装的时间,系统没有设置密码.做好系统后,进入制面板添加了密码或按ctrl + alt + del 设置密码后 在服务器管理-角色 ...
- 程序员编程利器:20款最好的免费的IDEs和编辑器
程序员编程利器:20款最好的免费的IDEs和编辑器 还没转眼明年可就大年三十了,忙的可真是晕头转了个向,看着亲朋好友们那让人欣羡的小肚腩,不禁感慨,岁月是一把猪饲料,绿了芭蕉,肥了那杨柳小蛮腰,可怜我 ...
- Datenode无法启动
执行start-dfs.sh后,或者执行datenode没有启动.很大一部分原因是因为在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令 这时主节点namenode的clus ...
- day02 智能合约
上午 1>部署智能合约网络 语法 require 2>利用第三方的节点 同步到以太坊 3>智能合约部署的步骤: 1.查看区块 2.发布合约 deploy后台经历的事情:就是部署合约的 ...