一道单调队列的好题

传送门:>Here<

题意:求一个连续子段,其长度在\([S,T]\)之间,使其平均值最大。保留三位小数

解题思路

考虑二分答案,转化为判定问题。设当前二分到\(k\),则一段满足要求的子序列一定满足:$$\dfrac{a[l]+...+a[r]}{r-l+1} \geq k$$于是变形可得$$a[l]+...+a[r] \geq k*(r-l+1)$$也就等同于$$(a[l]-k)+...+(a[r]-k) \geq 0$$于是我们只需要找出一段进行如上处理的序列中,长度在范围内的非负子序列即可。这个可以通过维护前缀和用单调队列实现

反思

一直没有推到最后一步。依然在判断$$a[l]+...+a[r] \geq k*(r-l+1)$$的子序列的存在问题。事实上这样的判断让二分没有意义了。我们是在找最大的一段a了,跟\(k\)完全没有关系。因为是求平均值,一段和较大的子序列不一定平均值就大了。我们巧妙地通过将\(k\)移项,使平均值问题转化为了求和问题

Code

注意长度有两个范围,所以在\(push\)的时候不是\(push(i)\),而是\(push(i-S)\)了

/*By DennyQi 2018*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 100010;
const int INF = 1061109567;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
int x = 0; int w = 1; register char c = getchar();
for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());
if(c == '-') w = -1, c = getchar();
for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;
}
int N,S,T;
double L,R,Mid,Ans;
int q[MAXN],a[MAXN];
double sum[MAXN];
inline bool judge(double k){
for(int i = 1; i <= N; ++i){
sum[i] = sum[i-1] + a[i] - k;
}
int h = 1, t = 1;
q[1] = 0;
for(int i = S; i <= N; ++i){
while(h <= t && q[h] < i-T) ++h;
if(i-S > 0){
while(h <= t && sum[q[t]] >= sum[i-S]) --t;
q[++t] = i-S;
}
if((i-q[h]>=S && i-q[h]<=T) && sum[i]-sum[q[h]] >= 0) return 1; }
return 0;
}
int main(){
// freopen(".in","r",stdin);
N = read(), S = read(), T = read();
for(int i = 1; i <= N; ++i){
a[i] = read();
sum[i] = sum[i-1] + a[i];
}
L = -10000.00, R = 10000.00;
while(R - L >= 1e-5){
Mid = (L + R) / 2.0;
if(judge(Mid)){
L = Mid;
Ans = Mid;
}
else{
R = Mid;
}
}
printf("%.3f", Ans);
return 0;
}

[洛谷P1419] 寻找段落的更多相关文章

  1. 洛谷—— P1419 寻找段落

    https://www.luogu.org/problem/show?pid=1419 题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段 ...

  2. 洛谷P1419寻找段落

    题目 单调队列+前缀和 #include <bits/stdc++.h> #define N 101001 using namespace std; int n, s, t; int da ...

  3. 【洛谷 P1419】 寻找段落(二分答案,单调队列)

    题目链接 开始还以为是尺取.发现行不通. 一看标签二分答案,恍然大悟. 二分一个\(mid\)(实数),把数列里每个数减去\(mid\),然后求前缀和,在用单调队列维护\(sum[i-t\text{~ ...

  4. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  5. P1419 寻找段落

    题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段落的定义是长度在[S,T]之间的连续序列.最有价值段落是指平均值最大的段落, 段落的平均 ...

  6. 洛谷P2296 寻找道路==codevs3731 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  7. 洛谷——P2296 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  8. [NOIP2014] 提高组 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  9. NOIP2014 day2 T2 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

随机推荐

  1. Eureka配置instanceId显示IP

    直接配置: eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-add ...

  2. Docker在Linux上运行NetCore系列(三)在Linux上使用Docker运行Asp.NetCore

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 开始说明 上几篇文章都是通过Linux运 ...

  3. sql字符串分割扩展方法

    可编程性—表值函数 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[Split] ( @RowData ...

  4. vue中使用provide和inject刷新当前路由(页面)

    1.场景 在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求. 2.遇到的问题 1. 用vue-router重新路由到当前页面,页面是不进行刷新的 2.采用window.rel ...

  5. 只需一行代码!Python中9大时间序列预测模型

    在时间序列问题上,机器学习被广泛应用于分类和预测问题.当有预测模型来预测未知变量时,在时间充当独立变量和目标因变量的情况下,时间序列预测就出现了. 预测值可以是潜在雇员的工资或银行账户持有人的信用评分 ...

  6. sqlsever存储过程配合代理作业自动定时建表

    1.自动建表存储过程 USE [ThreeToOne] GO /****** Object:  StoredProcedure [dbo].[WTO_CreateTable_ScanDoXXX]    ...

  7. 根据Webservice地址,动态传入参数(Webservice代理类)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sunlib; ...

  8. Diagnostics: File file:/tmp/spark-95cbb984-da28-4784-8b99-eb83ad74437f/__spark_libs__1421840316395076250.zip does not exist

    搭建spark环境,测试在yarn 上运行spark shell的时候出现的错误:Diagnostics: File file:/tmp/spark-95cbb984-da28-4784-8b99-e ...

  9. 使用docker安装mysql和redis

    本文介绍在linux下使用docker安装mysql和redis. 原文地址:代码汇个人博客 http://www.codehui.net/info/59.html 测试环境:centos7.6,do ...

  10. 使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js

    前言:前端小白一枚,刚注册博客,先发个学习过程中新碰到小问题试试水吧~ 摘要:最近在学习bootstrap,偶然碰到了一个小问题,bootstrap网站也没有做过多的解释,今天分享给大家. 问题描述: ...