CFR-744-Div-3解题报告
赛时 AC 2道题,掉大分(哭)
A. Casimir's String Solitaire
给你一个仅含 A,B,C 的字符串,每次可以删掉一个 A 和一个 B,或一个 B 和一个 C,位置、顺序不限,问能不能删完。
大水题,只需要判断 A 的数量加 C 的数量是否等于 B 的数量。一开始脑抽还判断 A 的数量是否等于 C 的数量
B. Shifting Sort
定义对一段区间的 Cyclically Shift
(以下简称Shift
) 操作为:
- 指定一个数
为操作的周期。 - 每次将区间左移一位,移出去的那一位放到最右边,重复
次。
给你一个数列 Shift
操作将
注意只要求不超过 Shift
操作(
eg.
原序列
2 5 1 4 3
将5归位
2 1 4 3 5
将4归位
2 1 3 4 5
将2归位
1 2 3 4 5
由于
C. Ticks
给你一个 *
和 .
两种状态,*
表示填,.
表示不填,问能不能通过若干个大小超过
“V字形”大小的定义:
*...*
.*.*.
..*..
的大小为
注意到
D. Productive Meeting
在一场见面会中有
由于
实现 1
先排好序,每次让剩余耐心值最大的两个人交谈,耐心值--,在考虑维护序列单调性,可以通过一通 lower_bound
和 upper_bound
以及 swap
来实现,时间复杂度
实现 2
使用 lower_bound
和 upper_bound
来维护需要考虑一大堆细节(我调错调了一下午加一晚上),不如用堆来维护。每次从堆里拿出两个耐心值最大的人,耐心值--,如果还有剩余耐心值,就把他们再扔回堆里,用 STL 的优先队列实现非常简洁,时间复杂度也是
E1. Permutation Minimization by Deque
在 Codeforces 中首次被 hack 祭。
给你一个
由于要让字典序最小,肯定最小的值放在最前面,最小值之前的数的放法先不管,放完最小值之前的数之后在把最小值放在最前面,最小值后面的数就只能从后面挨个放了。而最小值之前的数我们可以递归处理。
具体实现中我们需要用 ST 表维护区间最小值,再用分治递归的方法实现。
从通过人数上看,这道题的简单程度可是仅次于 A 题,怎么会这么复杂呢?
考虑用贪心的思想,先扔进去第一个数,以后对于每一个数,如果它比队首小,就扔到队首(这样可以让结果的字典序尽可能小),否则就扔到队尾(如果还扔到队首字典序就大了)。就是这么简单。
E2. Array Optimization by Deque
给你一个长度为
同样是贪心,对于每个数,如果放在队首,则贡献的逆序对数为前面比它小的数的个数,反之则为比它大的数的个数,这个数放在队首还是队尾对以后的方法不会产生干扰,所以只需要判断它前面是比它大的多还是比它小的多,这可以用树状数组或权值线段树维护。由于
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步