Codeforces Round # 740 (Div.2) 比赛总结
上大分!
代码能力还是差了太多,速度不快小错误一堆,不然就变色了QwQ。
A
题意:给出一个序列,每次可调整其 第奇数或偶数个 相邻的奇数位和偶数位 ,交替进行,问最少多少次可以将其摆成上升序列。
签到,发现每次操作至多 \(n\) 轮,直接暴力复杂度 \(O(n^2)\) 可以过。
B
题意:A、B轮流发球,若 A 在 B 的回合得分,或 B 在 A 的回合得分,称作一次 break ,给出 A 和 B 的获胜轮数,求可能的 break 总数有哪些。
考虑枚举 \(k\) 为可能的 break 总数,可以通过二元一次方程组解出 \(k_A\) 和 \(k_B\) ,即 A 丢的轮数和 B 丢的轮数,判断两者是否合法即可。
C
题意:你有值 \(x\) , \(n\) 个洞穴,每个洞穴有若干个关卡,每个关卡有权值 \(w\) ,能通过该洞穴当且仅当 \(x > w\) ,每过一个关卡能够使 \(x+1\) ,问能依次通过所有洞穴的最小初始 \(x\) ,洞穴的进入顺序不固定,同意洞穴内的关卡顺序固定。
求出通过每个洞穴所需的最小 \(x\) ,并从小到大排序,这一定是最优秀的通关顺序,然后根据这个顺序再计算通关上限即可。
D
题意: \(n\) 个格子,初始在 \(n\) 号格,每次可以从 \(x\) 直接跳到 \(\left[ 1,x \right)\) 的任意一个,或者确定一个 \(z\) ,跳到 \(\lfloor \frac{x}{z} \rfloor\) 号格(对于不同的 \(z\) 跳到同一格算作多种情况),问跳到 \(1\) 号格的方案数。
显然 DP ,设 \(f_i\) 表示从 \(n\) 跳到 \(i\) 的方案数, \(s_i\) 表示 \(f_i\) 的后缀和。
第一种从 \(s_{i+1}\)? 转移到 \(f_i\)? ,第二种枚举 \(z\)? ,能够从 \(x\)? 跳到 \(i\) 的位置范围为 \(\left[ z i , z(i+1) \right)\) ,后缀和优化转移即可。
时间复杂度是调和级数的, \(O(n \log n)\) 。
E
题意:一个 \(n (n \in \mathbb{O})\) 的排列,每次可以选择一段长度为奇数的前缀翻转,求出一种方案使得最后变成一个上升序列,操作数不能超过 \(\frac{5}{2}n\)。
已经放好的数我们不去动它,于是从大到小放,又因为只能是奇数长度,所以每次会确定两个数。
考虑每次确定最大两个数的位置,
- 先将奇数放到 \(1\) ;
- 然后将奇数放到偶数前;
- 将两个数翻到 \(2\) 、 \(3\) 位;
- 翻转前三个数;
- 将目前位于 \(12\) 位的两数翻到序列末尾。
这样每两个数至多操作 \(5\) 次,总操作次数不超过 \(\frac52 n\) 。