Codeforces Round #752 (Div. 1) (CF1603)
A
Description
给定一个长度为的序列,进行次删除操作:如果对于当前序列第个数对取模不等于,则可以将第个数删掉。给定序列,问是否可以通过这样的操作将所有元素全部删掉。
Solution
结论:对于每一个,只要存在一个不大于的数,使得取模该数不等于,那么序列就可以被完全删除。
证明:我们设表示被删掉的时候在序列中的位置,则对于满足且的所有都是合法的,我们需要证明对于任意一种合法的,都存在一种删除方案。我们每次可以选择最靠右的、满足的位置,将其删去。因为最开始有,第个位置的数需要在前面删掉个数才能顶到首位,所以不管何种状况下都有,也就是我们一定能找到一个的位置。如此删次即可。
B
Description
给定两个偶数,要求构造使得。
Solution
对于,;
对于,,此时
对于:
-
:,此时
-
:容易发现和都是不可能的,所以考虑在中间寻找答案。
假设,
,可以画出其函数图像,为一次函数。
,发现函数图像呈锯齿状。
求两个图像的交点即可。(由于为偶数,所以交点坐标一定是整数)
C
Description
有一种操作,每次可以将序列中的某个数拆成和为该数的两个数。
一个序列的extreme value定义为将该序列用此操作变成不降序列的最少操作次数。
给定一个序列,求其每个子串的extreme value的和对取模的结果。
Solution
从右往左拆每个数,当前拆出来的数应该小于等于右边的数,由此判断至少应该拆分成几个数,得到数字个数后,我们想尽可能拆得平均,即两两之差不超过1。然后考虑左边的数……
对于每个子串,它们的开头是不需要拆的,所以不同的子串会有很多不同的情况。
但是我们发现,对于一个数的平均拆分,得到的数的种类是的。所以对于每个位置将每一种划分结果的最左边的数的贡献都存下来,计算答案即可。
直接做的空间复杂度为,由于空间卡不满可以AC,不过也可以通过滚动数组优化到。
D
Description
定义表示满足且的数对的数量。
给定(),定义表示对于任意满足的的的最小值。
给定组,,求。
Solution
一个需要考虑的问题是如何快速计算。
其中为的前缀和,可以预处理得到。对于,可以通过整除分块计算。
一个结论是时。
证明:构造:,每一个区间的贡献即区间长度。如果在这个基础上进一步分段,仍然有区间贡献为区间长度。
有了这个结论,我们不仅可以只需要在小范围内枚举段数,而且可以将所有求出后再回答询问(这也意味着我们只能从前往后DP)。
那么我们设表示前个数分了段的最小值,容易得到一个的做法。
发现性质(证明显然),利用决策单调性来优化这个DP。考虑分治,区间的决策点在中,暴力检查的转移点在中的哪个位置,递归处理即可。
次分治的时间复杂度是的,而对于的计算,我们对于每一次分治都只需要用求出一个区间的、剩下的可以依次推得,故时间复杂度加上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】