CF1798C

题面

形式化题意:

给出长为 n 的两个序列 {a}{b},定义序列 {c} 满足:ci=dibi,其中 diai。求 {c} 最少能被分成多少个连续段,使得每个连续段内的值相同。

首先对于一个 i,如果 ci 能和 ci1 分到同一个段里,那么一定优于它单独成段或者和 ci+1 分到同一段里。因为在一个段里加一个数只会让这个段的限制更紧。

基于这个贪心有了一个思路:对于一个左端点 l,找到它能形成的最长合法连续段的右端点 r,然后令 ansans+1,lr+1 继续直到 l>n

现在问题来到对于一个 l,如何快速求 r

不妨对 {c} 的构造方式做一下转化:ci=aibiei,其中 eiai。由此可以发现,如果一个区间 [l,r] 合法,则这个区间的 c 值一定是 gcdi=lraibi 的约数,并且显然取最大公约数是最优的,由此可以求出每个 i 对应的 e。同时不难发现 r 的出现满足可二分性,因此只要 ST 表求区间 gcd,二分答案即可。

赛时 AC 记录

时间复杂度分析:ST 表初始化是 O(nlog2n)。设 len=rl+1,由于 check 在检测到不合法后立即返回,所以 check 一次的复杂度是 O(len),二分一次就是 O(lenlogn),又因为 len=n,所以二分答案总时间复杂度为 O(nlogn)。程序总复杂度为 O(nlog2n)。常数好像挺小的。

posted @   untitled0  阅读(13)  评论(0编辑  收藏  举报
相关博文:
·  CF1698D
·  CF1798E
·  CF1730
·  CF1895
·  CF1693D
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示