题意

题目链接

分析

  • 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) .

  • 贪心选择,肯定区间的端点是极小或者极大值。特殊处理区间长度 \(\leq L\) 的情况。

  • 有两种情况分别对应 \(r\) 作为最大和最小值。

    • \(r\) 作为最大值:枚举 \(a_r-r*mid\),查询 \(min\{a_l-l*mid\}\)并减去.
    • \(r\) 作为最小值:枚举 \(a_l+l*mid\),查询 \(min\{a_r+r*mid\}\)并减去.
  • 单调队列优化优化查询,因为如果一个点不是最后答案的话这个值一定比最优解大.

  • 总时间复杂度为\(O(nlogn)\)。

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
#define re(x) memset(x,0,sizeof x)
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=5e4 + 7;
const double eps=1e-7;
int T,n,k,L,R,tl,hd;
int q[N],a[N],f[2][N][18];
void rmq_init(){
rep(i,1,n) f[0][i][0]=f[1][i][0]=a[i];
for(int k=1;1<<k<=n;++k)
for(int i=1;1<<k<=n-i+1;++i)
f[0][i][k]=min(f[0][i][k-1],f[0][i+(1<<k-1)][k-1]),
f[1][i][k]=max(f[1][i][k-1],f[1][i+(1<<k-1)][k-1]);
}
int query(int l,int r,int g){
int k=0;
for(;1<<k+1<=r-l+1;k++);
if(!g) return min(f[g][l][k],f[g][r-(1<<k)+1][k]);
return max(f[g][l][k],f[g][r-(1<<k)+1][k]);
}
bool check(double mid){
double ans=-1.0*(1e14);
for(int i=L;i<=n;++i) if(1.0*(query(i-L+1,i,1)-query(i-L+1,i,0))/(L-1+k)>=mid) return 1;
hd=1,tl=0;
rep(i,1,n-L+1){
for(;hd<=tl&&i-q[hd]>R-L;++hd);
for(;hd<=tl&&(a[q[tl]]-q[tl]*mid)>=(a[i]-i*mid);--tl);
q[++tl]=i;
Max(ans,(a[i+L-1]-(i+L-1)*mid)-(a[q[hd]]-q[hd]*mid));
}
hd=1,tl=0;
for(int i=n;i>=L;--i){
for(;hd<=tl&&q[hd]-i>R-L;++hd);
for(;hd<=tl&&(a[q[tl]]+q[tl]*mid)>=(a[i]+i*mid);--tl);
q[++tl]=i;
Max(ans,(a[i-L+1]+(i-L+1)*mid)-(a[q[hd]]+q[hd]*mid));
}
return ans>=k*mid;
}
void work(){
n=gi(),k=gi(),L=gi(),R=gi();
rep(i,1,n) a[i]=gi();a[n+1]=0;
rmq_init();
double l=0,r=1000;
while(r-l>eps){
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.4lf\n",l);
}
int main(){
T=gi();
while(T--) work();
return 0;
}

[BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]的更多相关文章

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

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

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

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

  3. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

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

  5. BZOJ4476 JSOI2015送礼物(分数规划+单调队列)

    看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...

  6. BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 79  Solved: 58[Sub ...

  7. bzoj4476 [Jsoi2015]送礼物

    化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...

  8. 【BZOJ3316】JC loves Mkk 分数规划+单调队列

    [BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整 ...

  9. 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列

    单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...

随机推荐

  1. 更新tableView的某个cell

    更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewControlle ...

  2. UNIX高级环境编程(1)File I/O

    引言: Unix系统中主要的文件操作包括: open read write lseek close unbuffered IO和standard I/O相对应,后面的章节我们会讨论这两者的区别. 在讨 ...

  3. 触发器 视图 存储过程 mysql常用函数

                                                                                                        ...

  4. Zabbix日常监控(win_agent方式)

    参考博文:https://www.cnblogs.com/xqzt/p/5130469.html https://www.cnblogs.com/zoulongbin/p/6395047.html 本 ...

  5. zabbix的日常监控-自动化监控(十一)

    自动化监控: 1.自动注册 1.1.zabbix agent自动添加 2.主动发现 2.1.自动发现Discover 2.2.zabbix api 自动发现与自动注册,哪一个更好? 共同的特点均可以添 ...

  6. Shell中, 退出整个脚本

    常规做法 cat >test.sh<<EOF'' #!/bin/bash exit_script(){ exit 1 } echo "before exit" e ...

  7. Linux--安全加固02

    目录:1.BIOS2.SSH安全3.禁用telnet4.禁用代码编译5.ProFTP6.TCPwrappers7.创建一个SU组8.root通知9.history安全10.欢迎信息11.禁用所有特殊账 ...

  8. css背景精华所在+前端页面开发流程

    background属性 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: ...

  9. webpack.config.js配置遇到Error: Cannot find module '@babel/core'问题

    在webpack配置,将ES6转成ES5的时候,,出现Error: Cannot find module '@babel/core'错误最初以为是babel-core没有安装上.重装了好几遍babel ...

  10. oracle之修改/忘记用户密码

    一.修改/忘记用户密码: ## 修改oracle用户名和密码 sqlplus /nolog ## DBA角色进入 conn /as sysdba; ## 查看用户列表 select username ...