CF Round 788 Div2 题解
A题 Prof. Slim(签到)
给定一个长度为 的数列 (保证 ),我们可以对其进行若干次操作,每次操作都可以任意选择不同两项并交换他们的符号。
问,能否通过若干次操作,使得整个数列变为单调不降数列?
我们观察发现两个性质:
- 不管怎么操作,每个位置的数的绝对值都不会改变
- 使得单调不降,至少得把所有负号全部移到最前面
那么思路就显然了:统计数列中负号的数量,记为 ,当数列前 位的绝对值单调不增,后 位单调不降时,则能够通过操作使得整个数列单调不降。整个数列扫一遍,复杂度 。
B题 Dorms War(思维)
给定一个长度为 的字符串 和一个字符集合 。
接下来,对字符串不断进行如下操作,操作流程如下:
- 遍历所有字符,若该字符处于集合 中,则将其前一个字符打上标记
- 删除所有打上标记的字符
问,需要多少次操作之后,字符串不会再改变?(若操作次数为 ,则说明前 次操作后字符串长度都发生了改变,而 次及以后的操作则不会)
我们直接将其转换成 01 串(在集合内的字符为 1,反之为 0),将问题简化一下。
当串中仅包含一个 1 时,操作次数显然就是这个 1 前面 0 的个数。
当存在多个 1 时,我们发现,后面的 1 需要额外多操作一次,以和前面的 1 进行合并(合并本身不会改变 0 的数量)。
那么,整体操作流程如下:
- 将 01 串分割成若干仅包含一个 1,且 1 在最后的串(如 就拆成 )
- 统计每个串中 0 的数量
- 对于非第一个串的 0 的数量要加上 1,作为操作次数
- 求出最大值,即为整个串的总操作次数
(这题卡 STL 就 nm 离谱,第一次在 CF 上面被常数制裁
C题 Where is the Pizza?(数学,并查集)
给定两个不同的长度为 的排列 。
接下来,我们要从这两个排列来构造新排列 :
- 对于一些指定位置,例如 ,我们规定其值必然为 或者 中的一个(题目数据给定)
- 其他位置(例如 ),我们可以选择这个位置是 亦或是
问,我们一共有多少种不同的选择方式?
,答案对 取模,保证至少有一种方式
我们考虑位置没有指定的情况:
假定 ,我们令 ,那么 必然为 2(因为 ,已经选了,没法再选),随后 必然是 3(因为 也被选了)。
那么,我们注意到位置 组成了一个闭环:一旦某个位置上面的值被确定,那么剩下来的位置就跟着确定。那么,我们称这个闭环为一个联通块(模拟一下就可以发现,这个联通块不会随你的选择而变化,它是固定的)。我们记联通块数量为 ,那么答案就是 。
考虑到有些位置被确定了,那么我们直接看这几个位置在哪个联通块上,直接统计答案的时候跳过这几个对应的连通块即可。
D题 Very Suspicious(数学,二分)
这题建议直接看原题题面
这题二分没得跑,问题是,我们怎么求出: 条线最多可以搞出多少个三角形?
我们将画的线按照三类来分,随后发现:每次加上某一条种类的线,就能多上另外两种线的数量乘上 2 的三角形。
按照数学规律,最合适的方式就是三种线轮流加,类似如下形式:
那么,我们可以直接尝试公式递推得到 的值,然后模拟出 即可,规律如下:
__EOF__

本文链接:https://www.cnblogs.com/cyhforlight/p/16245934.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通