首页 > 其他分享 >P1419 寻找段落 题解

P1419 寻找段落 题解

时间:2024-09-08 15:50:36浏览次数:9  
标签:P1419 段落 平均值 int 题解 sum 这题 double 二分

其他学习笔记

这题真是凝聚了很多精华,那么我们就介绍这题的四兄弟:

  • 大哥 平均数 这道题是其他兄弟的基础。

  • 二哥 Best Cow 这位更是重量级,因为没特长只能强大哥的外貌,会大哥即识二哥。

  • 三哥 PROSJEK 这位哥看似有点创新却仍没逃过一家子的基因,只是变为了小数运算。

  • 四哥 寻找段落 作为我们压轴哥必须有牌面,但是却因此犯下了贪婪之罪,想包含所有的弟兄的特点来成为绿题,看似他是成功了,但也导致了他的 臭名昭著

而今天我们就要解析这个四哥,题意是找一个长度为 \(s\) 到 \(t\) 之间的区间使区间平均值最大。

看数据范围 \(n\le 1e5\),可以分析一下什么复杂度的算法能实现(感觉分析一下是很有意义的),首先 \(n^2\) 肯定不行,那常见的还有 \(O(n)\) 和 \(O(n\log n)\) 常见吗? ,感觉可以采用第二个复杂度,那带 \(\log\) 的算法那不直接就是二分 (分治)

一般求什么二分什么,我们直接就二分平均值答案,注意这题可能会有负数,而且答案是浮点数,我们就要用负数浮点数二分答案,如何实现下看代码或看学习笔记,然后将这个平均数带入函数判断是否合法,如果合法调大,反之调小。

函数首先求了个前缀和并减去平均值得到一个 \(sum[]\),接着用一个单调队列使得 \(l\) 指向 \(sum\) 值最大的下标,如果目前遍历到的点的 \(sum_i - sum_l\) 的值大于 \(0\) 代表这个区间假设平均值是合法,然后调整 \(l\) 反复直到到达边界。

下见代码:

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
const double eps=1e-6;
double sum[N];
int a[N]; 
int q[N];
int n,m;
int s,t;
int check(double mid){
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+a[i]-mid;
	}
	int l=1,r=0;
	for(int i=1;i<=n;i++){
		if(i>=s){
			while(r>=l&&sum[i-s]<sum[q[r]]){
				r--;
			}
			q[++r]=i-s;
		}
		if(l<=r&&q[l]<i-t){
			l++;
		}
		if(l<=r&&sum[i]-sum[q[l]]>=0){
			return 1;
		}
	}
	return 0; 
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>s>>t;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}	
	double l=-1e4-1,r=1e4+1;
	while(l+eps<r){
		double mid=(l+r)/2;
		if(check(mid)){
			l=mid;
		}
		else{
			r=mid;
		}
	} 
	printf("%.3lf",l);
    return 0;
}

标签:P1419,段落,平均值,int,题解,sum,这题,double,二分
From: https://www.cnblogs.com/sadlin/p/18402931

相关文章

  • 【题解】CPS-S模拟2
    目录PreT1.不相邻集合题目描述部分分40pts10pts正解思路代码T2.线段树题目描述部分分20pts正解思路代码T3.部分分40pts正解思路代码T4.部分分10pts正解思路代码AndPre赛时没有第一时间找到签到题,遂四处游走,后来决定先打T1,约1h时切了,然后1h打后3题暴力,后面推了推T4一个特殊性质,......
  • [ABC370C] Word Ladder 题解
    题目描述:给予两个相等长度的序列,\(S\)与\(T\),以及一个空数组\(X\),每在\(S\)上修改一个字符,便将修改后的\(S\)加入\(X\)中,直到\(S\)与\(T\)相同。(输出字典序最小的\(X\)数组)拿过题一看,感觉还是蛮简单的,本题主要的难点在字符串的字典序上。字符串字典序的定义......
  • P11019 「LAOI-6」[太阳]] 请使用最新版手机 QQ 体验新功能 题解
    非常简单的模拟题。由题意得,即找出输入字符串中,用[]围起来的片段中的大写字母\(A_1,A_2,A_3...A_n\)然后将其转换为小写输出\(/a_1a_2a_3...a_n\)即可。#include<bits/stdc++.h>#defineseq(q,w,e)for(intq=w;q<=e;q++)#definelllonglongusingnamespace......
  • P11020 「LAOI-6」Radiation 题解
    一道简单的构造题,其实不用想的十分复杂的说。首先,最多发射的宇宙射线\(sum\)也最多为\(sum_{max}=min(m,n)\)也就是说,无论如何摆放石子,也只能达到这个数量。那么我们的目的便变成了如何让石子变成这一个形状。如上图,在一个\(3\times6\)的矩阵中,其实只要三颗石子即可满足......
  • AtCoder Beginner Contest 370 A-F题解
    A#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;mt19937rnd(time(0));#defineintlonglongtypedeftuple<int,int,int>tp;#definexfirst#defineysecondtypedefpair<int,int>pii;typedefpair<double,double>......
  • 配置PHP的Session存储到Mysql / Redis / memcache 以及使用opcache以及apc缓存清除工
    一、配置PHP的Session存储到Mysql,Redis以及memcache等        PHP的会话默认是以文件的形式存在的,可以通过简单的配置到将Session存储到NoSQL中,即提高了访问速度,又能很好地实现会话共享!1.默认配置:session.save_handler=filessession.save_path=/tmp/2.配......
  • 【洛谷 P1996】约瑟夫问题 题解(队列+模拟+循环)
    约瑟夫问题题目描述个人围成一圈,从第一个人开始报数,数到的人出列,再由下一个人重新从开始报数,数到的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰名小朋友,而该题是全部出圈。输入......
  • 【题解】CF1955E
    CF1955E翻译思路代码翻译原题链接CF1955E思路  由于每次操作区间长度是定值,所以我们可以说,如果最前面的数已经是1了,那它再也不会被进入操作。因为如果把它变回0,那想再变成1只能以它为起点再操作一次,前后两次操作抵消。  所以思路很简单,直接......
  • Leetcode 第 409 场周赛题解
    Leetcode第409场周赛题解Leetcode第409场周赛题解题目1:3242.设计相邻元素求和服务思路代码复杂度分析题目2:3243.新增道路查询后的最短距离I思路代码复杂度分析题目3:3244.新增道路查询后的最短距离II思路代码复杂度分析题目4:3245.交替组III思路代码复杂度......
  • 题解:AT_abc370_c [ABC370C] Word Ladder
    说句闲话并不会有更好的阅读体验。这题是一个比较奇葩的贪心、构造。也可以认为是一个数据结构略有难度的练习题。理论部分?>注:使用\(N\)表示字符串长度。一句段话题意:三个字符串\(S\)、\(T\)、\(X\),其中\(S\)和\(T\)仅包含小写字母且等长,\(X\)为空。每一个操作可以......