2021牛客多校第五场 题解
H题 Holding Two(构造,找规律)
给定正整数 ,要求构造一个 行 列的矩阵 ,元素为
0
或者1
,保证同一行的连续三个元素,同一列的连续三个元素,对角线上的连续三个元素,都不可能相等。
观察样例,推一推,不难构造出这样一种矩阵:
代码如下:
K题 King of Range (ST表/单调队列,双指针)
给定一个长度为 的数列 ,以及 次询问。
每次询问给出一个整数 ,问一共存在多少组不同区间,使得区间的最大值减去最小值大于 。
我们可以先 建一个 ST 表,这样就可以 查询每个区间了(我第一遍用了一个黑心模板,每次查询是 的,害得我超时一次,逆天)。
这题看起来好像没法离线,所以我们必须在线处理,考虑到 的范围,我们不难猜测正解里的每次询问复杂度是 的,而序列上的 算法,很难不想到双指针。
显然,倘若区间(l,r)
满足要求,那么任何包含该区间的区间同样符合要求,因为扩展区间只会使得最大值更大,最小值更小,两者之差必然更加大于 。那么我们不妨双指针进行处理:固定左端点L
后,将右端点不断向右移动,当 的时候,给答案加上 ,随后将左端点向右移一位,重复该流程。这个方法是 的,最终的总复杂度为 。
此外,我们也可以用单调队列来维护区间极值,但是并不如 ST 表那么直观好写(主要是我不是很会写),而且这并不能降低本题的复杂度,所以就不贴代码了。
B题 Boxes (数学:概率)
给定 个盒子,每个盒子里面有一个白球或者黑球,概率均为 。打开第 个盒子需要 的代价。
我们随时可以花费 的代价开挂,知道此时场上还没开的盒子里面有几个黑球。
问采取最优策略的情况下,知道每个盒子装着什么球所花最小代价的数学期望。
我们不难想到,采取最优策略,必然是先开代价小的后开代价大的,所以我们将所有盒子按照 从小到大进行排序,复杂度为 。
我们记 为前 位并非完全相同,但后 位完全相同的情况(注意,这里要发现第 位和第 位要不相同),推出正常状态下 。特别的,。
得到概率公式之后,我们推出答案公式:
( 是开启前 个盒子的代价)
做一次前缀和后线性递推即可,复杂度 。
D题 Double Strings (线性DP,组合数)
给定两个字符串 ,要求我们从中各选出一个子串,分别记为 ,且满足:
- , 是一个正整数
求出不同组合 的总个数(这里的不同,是指字符对应的下标不同)。
,两个字符串均只包含小写字母
简单来说,这两个字符串存在某一位具有大小关系,前面部分完全相同,后面部分随便即可。
求公共前缀数量可以预处理,是一个典型的二维 DP,记 为 的前 位, 的前 位所能构成的公共子序列的数量,有如下 DP 方程,边界条件为 ,复杂度 。
值得一提的是,本题允许这个前缀是空的,所以统计答案的时候,还要对每个 加上一才对。
后面的就是排列组合算了,假设后面 还剩下 位, 还剩下 位,那么后面的可能的后缀长度为
我们假设 ,根据组合的对称性,可得
这东西如果在高中做,我感觉我想的可能会快一点:二项式定理!
记 ,那么便有
(附:当 时,记 )
也就是说, 的系数恰好就是 。又因为 ,所以我们得到
我们也先 的预处理出所有的组合数即可。
考虑到这个数据规模,不太好用杨辉三角来预处理组合数,所以我们必须用别的方法来 的处理它。因为需要对分数取模,所以显然是要预处理所有阶乘的乘法逆元()。
根据费马小定理,可知 ,所以我们可以先算出 的逆元。
随后,我们便可以线性递推出其他阶乘的逆元:
然后我们便可以 的计算组合数了:
处理好了所有的前缀和后缀,我们便可以 的枚举中间断点,随后 的查询所有的前缀和后缀,并计入答案即可。本题虽然要算的东西贼多,但是最终的总复杂度还是 的。
J题 Jewels (二分图带权匹配)
现在有 个气球,第 个气球的坐标为 。每个气球有一个速度 ,也就是说,时刻 的时候,第 个气球的坐标为 。
我们在点 处。每个时刻(从
0
开始)都可以拿走一个气球,同时花费 的体力(若拿走的这个气球在 处,那么 )。问我们应该采取怎样的顺序,才能花费最少的体力,拿走所有的气球,并输出花费体力的最小值。,所有数据均为整数
显然,每个点的 坐标对于答案并无影响,我们只需要正常将其加上去就好了。那么,我们便可以将这个问题从三维空间系化到了一维的数轴上。
排完序之后,我们需要使 最大,也就是使 最大,......
以上没啥子用,下面直接看正解:
显然,用n
次便可以拿走所有的气球,也就是说,我们需要将这几个时间和对应拿走的气球一一对应,我考试的时候想到的是基于临项交换的贪心什么什么的,但是这题让我属实开眼界了:构建一个二分图,左边是各个时间点,右边是气球,两边之间的边权则是对应时间所花的体力(一种基于时间的建模方式)。显然,这是一个二分图的带权匹配问题。(但有一说一,我记得不知道在哪看过,当数据规模在100-300
这一级的时候,要么是 Floyd 或者各种 DP,要么就是网络流/二分图了)
因为这显然是一个完备匹配,而且图十分稠密,所以可以使用 KM 算法来完成。(这题数据贼逆天,费用流和基于 DFS 的 KM 算法全部都 TLE 了,必须得用 BFS 优化过的 KM 算法,或者用其他奇奇怪怪方法对普通KM进行优化,才能完成这题)
__EOF__

本文链接:https://www.cnblogs.com/cyhforlight/p/15108767.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话