CF1730
感觉这场的题目出得很好啊,让人忍不住想记录下来!
赛时通过 ABCD,rank 。
A
把每一种数的出现次数和 取个 再求和即可。
B
记 ,答案即 。
C
直接贪心即可。具体地,最后的串肯定是不减的,所以我们只需要求出每种数字的出现次数即可。发现一个位置的数会被 当且仅当存在一个小于它的数 ,使其位于最后一个 的数右侧、最后一个 左侧;否则这个数可以不用被 。
D
可能写得比较混乱。
假设 ,我们手模一种情况,比如最终的串为 ,我们发现 ,其中 。进一步地,我们把 反转,并考察 ,其必然由 两个位置上的字符构成,设为 ,因为它们可以匹配,所以无序对 ,我们把所有无序对求出来并把相同的进行匹配,可以证明答案为 YES
当且仅当全部匹配完或者最终剩下一个形如 的对。
E
其实不难想,但是比赛的时候想复杂了,赛后冷静下来就会了。
有许多种 的做法,但对于我这个大常数 sb 来说这个复杂度肯定过不去,我们需要寻求时间复杂度更低的做法。
从左到右枚举 ,钦定最大值为 (如果有多个,钦定最大值为最左侧的)并枚举其约数 。 的情况是容易的,这里仅考虑 的情况。此时我们再枚举 在 的左侧还是右侧,以左侧为例,我们现在来考虑什么样的 是能被这种情况计入答案的:
- ;
- ;
- ;
- 。
右侧是类似的。
我们需要 地回答。发现我们只需要处理每个数出现的所有位置和每个 左侧 / 右侧第一个小于 / 大于它的位置即可,所以跑四遍单调栈就能解决问题。
但是其实这么做的话细节很多,在此不一一赘述了,有问题可以看看又臭又长的代码,欢迎大家关注 BraveXuZhiJieGoGoGo 这个号。
时间复杂度 ,其中 。
F
感觉比 E 好想又好写啊!
首先把问题转化为求最少的交换相邻两数的次数,使得交换完成后对于 有 。
发现对于一个前缀 ,其中的数肯定 ,并且 肯定已经全部出现了,剩下的是 这 个数,搜一下发现有 种状态满足条件,这很好啊!于是直接设 表示前 个数的状态第 种的最小交换次数即可。转移考虑填 或者填 的数。
还有一个问题是初值 的预处理。事实上因为只有 个数,直接枚举排列并暴力计算即可!
时间复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通