LG1419 【寻找段落】
分析
题目要求求一个最大的实数\(x\),使得某长度在\([S,T]\)之间的区间\([L,R]\)满足
\]
即
\]
由于答案满足单调性,所以可以二分\(x\),转化为判断问题,即判断
\]
\(\rightarrow\)
\]
对这个式子求前缀和,就可快速算出一段区间的和,令
\]
则区间\([L,R]\)合法的条件为
\]
转化成这种形式,已经很好做了。维护一个单增的单调队列,然后判断当前遍历元素是否大于等于队首元素即可。
时间复杂度
假设数据范围为\(A\),则二分答案是\(O(\log A)\)的,判断一次用了前缀和和单调队列,是\(O(n)\)的,总时间复杂度为\(O(n\log A)\)。
小优化
题目要求保留3位小数,而对浮点数的操作很麻烦,所以不妨对每个数乘10000(多一位是因为要四舍五入),然后算答案时再除10000.0就行了。
用STL的deque实现单调队列,嫌慢手打,使用相同API即可~~(然而这题不卡可以水^_^)~~。
#include<iostream>
#include<cstdio>
#include<deque>
#include<cstring>
#define rg register
template<typename T>inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(ch!='-'&&!isdigit(ch))
ch=getchar();
if(ch=='-')
w=-1,ch=getchar();
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return x=data*w;
}
using namespace std;
typedef long long ll;
const int MAXN=1e5+7;
int n,S,T;
int a[MAXN];
ll sum[MAXN]; // prefix sum
int L=1e8,R=-1e8;
deque <int> Q;
inline bool judge(int x)
{
// cerr<<"judging x="<<x<<endl;
memset(sum,0,sizeof(sum));
for(rg int i=1;i<=n;++i)
{
sum[i]=sum[i-1]+a[i]-x;
// clog<<"sum["<<i<<"]= "<<sum[i]<<endl;
}
Q.clear();
for(rg int i=S,p=0;i<=n;++i,++p)
{ // 只有一段不包括本身的区间内合法,就开两个扫描线
while(!Q.empty()&&sum[Q.back()]>sum[p])
Q.pop_back();
Q.push_back(p);
while(Q.front()<i-T) // 这里不用判空是因为p一定存在
Q.pop_front();
if(sum[i]-sum[Q.front()]>=0)
return 1;
}
// cerr<<"failed"<<endl;
return 0;
}
int main()
{
read(n);read(S);read(T);
for(rg int i=1;i<=n;++i)
{
read(a[i]);
a[i]*=1e4;
// cerr<<"a["<<i<<"]= "<<a[i]<<endl;
L=min(L,a[i]);
R=max(R,a[i]);
}
while(L<R)
{
int M=(L+R+1)>>1;
if(judge(M))
L=M;
else
R=M-1;
}
printf("%.3f",L/1e4);
}
Hint
最后说一下单调队列的边界问题。合法区间\([L,R]\)满足
\]
由于使用前缀和,那么\(i\),\(p\)应满足
\]
也就是说应弹掉\(p<i-T\)的那些点。
还有就是二分答案的边界。求最后一个类型应该int M=(L+R+1)>>1;
LG1419 【寻找段落】的更多相关文章
- LuoguP1419 寻找段落(二分 单调队列
题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段落的定义是长度在[S,T]之间的连续序列.最有价值段落是指平均值最大的段落, 段落的平均 ...
- P1419 寻找段落
题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段落的定义是长度在[S,T]之间的连续序列.最有价值段落是指平均值最大的段落, 段落的平均 ...
- 洛谷—— P1419 寻找段落
https://www.luogu.org/problem/show?pid=1419 题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段 ...
- [洛谷P1419] 寻找段落
一道单调队列的好题 传送门:>Here< 题意:求一个连续子段,其长度在\([S,T]\)之间,使其平均值最大.保留三位小数 解题思路 考虑二分答案,转化为判定问题.设当前二分到\(k\) ...
- 【洛谷 P1419】 寻找段落(二分答案,单调队列)
题目链接 开始还以为是尺取.发现行不通. 一看标签二分答案,恍然大悟. 二分一个\(mid\)(实数),把数列里每个数减去\(mid\),然后求前缀和,在用单调队列维护\(sum[i-t\text{~ ...
- 【Luogu】P1419寻找段落(单调队列)
题目链接 不知为何状态突然奇差无比,按说这题本来应该是水题的,但不仅不会做,还比着题解爆零五次 二分平均值(想到了),单调队列维护最大区间和(想到了但是不会,???为什么我不会???) #includ ...
- luoguP1419 寻找段落(二分答案+单调队列)
题意 给定一个长度为n的序列a1~an,从中选取一段长度在s到t之间的连续一段使其平均值最大.(n<=100000) 题解 二分答案平均值. judge时把每一个a[i]-mid得到b[i] 在 ...
- 洛谷P1419寻找段落
题目 单调队列+前缀和 #include <bits/stdc++.h> #define N 101001 using namespace std; int n, s, t; int da ...
- luogu1419 寻找段落 (二分,单调队列)
单调队列存坐标 #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
随机推荐
- centos7: iptables保存(配置完nginx的web规则后)
centos7: iptables保存(配置完nginx的web规则后) 以本地虚拟机为例: 添加规则:入站规则 iptables -I INPUT -p tcp --dport 80 -j ACCE ...
- rabbitmq 消息的状态转换
tutorial:http://www.rabbitmq.com/tutorials/tutorial-two-java.html 这里解释接收消息端关于 acknowledge和prefetch的设 ...
- Android Webview 和Javascript交互,实现Android和JavaScript相互调用
在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...
- 『科学计算』通过代码理解线性回归&Logistic回归模型
sklearn线性回归模型 import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model de ...
- 关于vue Unexpected identifier 问题
vue对于es6虽然自带babel转换 但是在index.html文件中并不会发生转换 因此在index.html中使用新的语法会导致低版本浏览器不识别代码因此报出Unexpected identif ...
- js实现欧几里得算法
概念 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法. 证明 首先假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,那么a可 ...
- BZOJ1342 [Baltic2007]Sound静音问题
越来越水了... 这道题是简单的单调队列,同时维护最大值和最小值即可. 另解:multiset大法求区间最大最小,但是复杂度会上升... /****************************** ...
- 小程序animation动画效果综合应用案例(交流QQ群:604788754)
如果案例有问题,可到QQ群找到今日相关压缩文件下载测试. WXML: <view class="cebian"> <view animation="{{ ...
- Python中简化的验证码功能实现
#!/usr/bin/env python # _*_ encoding:utf-8 _*_ # author:snate import random def generate_auth_code() ...
- C#阿里云 移动推送 接入
接入阿里云的 移动推送 SDK,实现在后台直接 发送消息给APP的功能. ----------------OpenAPI进行推送 2.0高级接口 阿里云配置准备:1.移动app配置:打开 ...