【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
【BZOJ4476】[Jsoi2015]送礼物
Description
JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物。
萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感。于是,JYY决定从中挑选连续的一些礼物,但究竟选哪些呢?
【问题描述】
假设礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第i1< =i< =N个位置的礼物美观度为正整数Ai,。JYY决定选出其中连续的一段,即编号为礼物i,i+1,…,j-1,j的礼物。选出这些礼物的美观程度定义为
(M(i,j)-m(i,j))/(j-i+k)
其中M(i,j)表示max{Ai,Ai+1....Aj},m(i,j)表示min{Ai,Ai+1....Aj},K为给定的正整数。
由于不能显得太小气,所以JYY所选礼物的件数最少为L件;同时,选得太多也不好拿,因此礼物最多选R件。JYY应该如何选择,才能得到最大的美观程度?由于礼物实在太多挑花眼,JYY打算把这个问题交给会编程的你。
Input
本题每个测试点有多组数据。输入第一行包含一个正整数T(T< =10),表示有T组数据。
每组数据包含两行,第一行四个非负整数N,K,L,R(2< =L< =R< =N。第二行包含N个正整数,依次表示A1,A2....An,(Ai< =10^8),N,K< = 50,000
Output
输出T行,每行一个非负实数,依次对应每组数据的答案,数据保证答案不会超过10^3。输出四舍五入保留4位小数。
Sample Input
5 1 2 4
1 2 3 4 5
Sample Output
题解:显然先分数规划,然后根据贪心,选出来的区间的最大和最小值一定是在两端的,设最大值为v[i],最小值为v[j],所以式子就变成:
v[i]-v[j]-(i-j+k)*mid>0或v[i]-v[j]-(j-i+k)*mid>0
然后分开讨论,第一个变成求(v[i]-i*mid)-(v[j]-j*mid)的最大值,第二个变成求(v[i]+i*mid)-(v[j]+j*mid)的最大值,题解说可以用单调队列搞定,但是我比较懒,直接用的RMQ。
但是感觉不对?当最大最小值的距离<L时,我们也要将长度视为L,即v[i]-v[j]-(L-1+k)*mid>0,同理,求v[i]-v[j]的最大值即可,依旧RMQ。
所以。。。所以RMQ比单调队列慢。。。所以又光荣的变成status倒数第一,并且时间也很吉利~
(时限30s)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const double eps=1e-7;
const int maxn=100010;
int n,K,L,R,h,t;
int v[maxn],Log[maxn];
double f1[18][maxn],f2[18][maxn];
int f[18][maxn];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
double q1(int l,int r)
{
int k=Log[r-l+1];
return min(f1[k][l],f1[k][r-(1<<k)+1]);
}
double q2(int l,int r)
{
int k=Log[r-l+1];
return min(f2[k][l],f2[k][r-(1<<k)+1]);
}
int q(int l,int r)
{
int k=Log[r-l+1];
return min(f[k][l],f[k][r-(1<<k)+1]);
}
bool solve(double sta)
{
int i,j;
double ret=-99999999.9999;
for(i=1;i<=n;i++) f1[0][i]=v[i]-sta*i,f2[0][i]=v[i]+sta*i;
for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++)
f1[j][i]=min(f1[j-1][i],f1[j-1][i+(1<<j-1)]),f2[j][i]=min(f2[j-1][i],f2[j-1][i+(1<<j-1)]);
for(i=1;i<=n;i++)
{
if(i>=L) ret=max(ret,f1[0][i]-q1(max(1,i-R+1),i-L+1));
if(i<=n-L+1) ret=max(ret,f2[0][i]-q2(i+L-1,min(n,i+R-1)));
}
for(i=1;i<=n;i++)
{
ret=max(ret,v[i]-q(max(1,i-L+1),min(n,i+L-1))-sta*(L-1));
}
return ret>=K*sta;
}
void work()
{
n=rd(),K=rd(),L=rd(),R=rd();
int i,j;
for(i=1;i<=n;i++) f[0][i]=v[i]=rd();
for(i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) f[j][i]=min(f[j-1][i],f[j-1][i+(1<<j-1)]);
double l=0,r=1000,mid;
while(r-l>eps)
{
mid=(l+r)/2;
if(solve(mid)) l=mid;
else r=mid;
}
printf("%.4lf\n",l);
return ;
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}
【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ的更多相关文章
- [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...
- [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) ...
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
- bzoj4476 [Jsoi2015]送礼物
化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...
- BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列
BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...
- P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...
- luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性
LINK:送礼物 原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30. 以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉. 能过的\ ...
- GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ
题目描述 JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,JYY决定从中 ...
- JSOI 2015 送礼物
[BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...
随机推荐
- codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新
DZY Loves Fibonacci Numbers Time Limit:4000MS Memory Limit:262144KB 64bit IO Format:%I64d &a ...
- c#.NET的事件与委托例子
原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- C# 获取当前目录上一级目录
string path="D:\AA\BB\CC"; Directory.SetCurrentDirectory(Directory.GetParent(path).FullNam ...
- Day 21 三元表达式、生成器函数、列表解析
知识点程序: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "DaChao" # Date: 2017 ...
- postgresql 10 分页
示例: select * from test limit 2 offset 2; limit:指查多少条数据 offset:从下标多少开始查,下标从0开始,不能为负数. offset计算公式: var ...
- AC日记——网络最大流 洛谷 P3376
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- BZOJ 1044 木棍分割(二分答案 + DP优化)
题目链接 木棍分割 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3830 Solved: 1453[S ...
- 洛谷—— P1875 佳佳的魔法药水
https://www.luogu.org/problemnew/show/1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的 ...
- jenkins按角色授权
当一个公司的开发分为多个组或者是多个项目时,不能让所有的开发都公用一个构建,否则将会变得很混乱,为了解决这一问题,jenkins提供了角色授权的机制.每个开发有着对应的账号和权限,可以自行新建.构建. ...
- Ant -----ant标签和自定义任务
随便记一下 Ant的用法吧.ant ,maven, gradle ,三个打包工具到齐了,Ant 常见标签解析,ant 自定义task . <?xml version="1.0" ...