热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[CF949D]Curfew二分答案是个不错的开头,困难部分在于如何检查

本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。
题目

传送门 to luogu

思路

二分答案是个不错的开头,困难部分在于如何检查。

考虑这样一种逃逸方式:既然 d≥1d\ge 1d1 ,那么宿管是移动最慢的。在他即将锁门的时候,跑到更居中的位置去。于是,所有合格的寝室都居中

两边都要搞定,其实可以分开判断。就好比 LLB\tt LLBLLB 上午学文化课,可以考好;下午学竞赛,可以考好。那么二者都学好,也是可以做到的。这里很重要的一点是,总人数是一定足够的,并且都可以用在某一边(不至于无所事事)。

用前缀和的方式,求出在任意时刻,能够到达宿管即将锁门的寝室的人有几个。然后就可以判断了。

此时回头看自己的 if\tt ifif 语句&#xff0c;竟然是 xx<fi 的形式&#xff0c;且 fif_ifixxx 无关&#xff01;那么我们可以改成 O(n)\mathcal O(n)O(n) 的直接枚举。

代码

#include
#include
#include
#include
#include
using namespace std;
inline int readint(){int a &#61; 0; char c &#61; getchar(), f &#61; 1;for(; c<&#39;0&#39;||c>&#39;9&#39;; c&#61;getchar())if(c &#61;&#61; &#39;-&#39;) f &#61; -f;for(; &#39;0&#39;<&#61;c&&c<&#61;&#39;9&#39;; c&#61;getchar())a &#61; (a<<3)&#43;(a<<1)&#43;(c^48);return a*f;
}
template < class T >
void getMax(T&a,T b){ if(a < b) a &#61; b; }
template < class T >
void getMin(T&a,T b){ if(b < a) a &#61; b; }const int MaxN &#61; 100002;
const int Mod &#61; 998244353;
long long a[MaxN]; int d, b, n;void input(){n &#61; readint(), d &#61; readint();b &#61; readint();for(int i&#61;1; i<&#61;n; &#43;&#43;i)a[i] &#61; readint()&#43;a[i-1];
}long long now[MaxN];
void solve(){long long ans &#61; MaxN;for(int i&#61;(n&#43;1)/2; i; --i){int t &#61; min(1ll*i*d&#43;i,0ll&#43;n);now[i] &#61; now[i&#43;1]; // 后缀getMax(now[i],i-a[t]/b);}for(int i&#61;(n&#43;1)/2&#43;1; i<&#61;n; &#43;&#43;i){int r &#61; n-i&#43;1, t;t &#61; max(i-1ll*r*d-1,0ll);if(i !&#61; (n&#43;1)/2&#43;1)now[i] &#61; now[i-1]; // 前缀getMax(now[i],r-(a[n]-a[t])/b);}for(int x&#61;0; x<&#61;(n&#43;1)/2; &#43;&#43;x){long long xez &#61; now[x&#43;1];getMax(xez,now[n-x]);getMin(ans,max(xez,0ll&#43;x));}printf("%lld\n",ans);
}int main(){input(), solve();return 0;
}

再给出二分版的 check() &#xff0c;可以对比二者的区别&#xff1a;

for(int i&#61;x&#43;1; i<&#61;(n&#43;1)/2; &#43;&#43;i){if(1ll*i*d&#43;i >&#61; n) break;if(a[i*d&#43;i]/b < i-x)return false;}for(int i&#61;n-x; i>(n&#43;1)/2; --i){int r &#61; n-i&#43;1;if(i-1ll*r*d <&#61; 1) break;if((a[n]-a[i-r*d-1])/b < r-x)return false;}return true;


推荐阅读
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • 问题描述:通过添加最少数量的括号,使得给定的括号序列变为合法,并输出最终的合法序列。数据范围:字符串长度不超过100。涉及算法:区间动态规划(Interval DP)。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
author-avatar
乐檬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有