博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P1419】 寻找段落(二分答案,单调队列)
阅读量:6258 次
发布时间:2019-06-22

本文共 1369 字,大约阅读时间需要 4 分钟。

开始还以为是尺取。发现行不通。

一看标签二分答案,恍然大悟。
二分一个\(mid\)(实数),把数列里每个数减去\(mid\),然后求前缀和,在用单调队列维护\(sum[i-t\text{~}i-s]\)的最小值,用\(sum[i]\)减去它,如果大于等于\(0\)就说明\(mid\)可行。

#include 
#include
using namespace std;#define INF 2147483647const int MAXN = 100010;const double eps = 1e-6;int n, s, t, head, tail;int a[MAXN];int q[MAXN];inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar(); return s * w;}int Min = INF, Max = -INF;double l, r, mid, sum[MAXN];inline int check(double mid){ head = tail = 0; for(int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i] - mid; for(int i = s; i <= n; ++i){ int in = i - s; while(head < tail && sum[in] < sum[q[tail]]) --tail; q[++tail] = in; while(head < tail && q[head + 1] < i - t) ++head; if(sum[i] - sum[q[head + 1]] >= 0) return 1; } return 0;}int main(){ n = read(); s = read(); t = read(); for(int i = 1; i <= n; ++i){ a[i] = read(); Min = min(Min, a[i]); Max = max(Max, a[i]); } l = Min; r = Max; while(r - l > eps){ mid = (l + r) / 2.0; if(check(mid)) l = mid; else r = mid; } printf("%.3lf\n", l); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/10199599.html

你可能感兴趣的文章
PHP 如何显示大数字,防止显示为 科学计数法 形式
查看>>
数据扩展性探讨和总结--转
查看>>
spider RPC高级特性
查看>>
C# 导出资源文件到硬盘
查看>>
修复 ThinkPHP3.2.3 抛出异常模块的一个BUG,关闭字段缓存功能
查看>>
更改MySQL数据库的编码为utf8mb4
查看>>
android自动化测试--appium运行的坑问题及解决方法
查看>>
mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
查看>>
TeamCity : .NET Core 插件
查看>>
Python 爬虫知识点 - XPath
查看>>
由数量众多照片拼贴而成的马赛克图片
查看>>
如何在linux Shell脚本里面把一个数组传递到awk内部进行处理
查看>>
共模电感的原理以及使用情况
查看>>
GridLookUpEdit多列模糊查询最简单方式 z
查看>>
memcache与Redis
查看>>
Python27中Json对中文的处理
查看>>
结构,是指事物自身各种要素之间的相互关联和相互作用的方式
查看>>
andoid电阻触摸移植
查看>>
备忘录模式
查看>>
U盘安装CentOS 7卡住在 mounting configuration file system
查看>>