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 ight)) 的任意一个,或者确定一个 (z) ,跳到 (lfloor frac{x}{z} floor) 号格(对于不同的 (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) ight)) ,后缀和优化转移即可。
时间复杂度是调和级数的, (O(n log n)) 。
E
题意:一个 (n (n in mathbb{O})) 的排列,每次可以选择一段长度为奇数的前缀翻转,求出一种方案使得最后变成一个上升序列,操作数不能超过 (frac{5}{2}n)。
已经放好的数我们不去动它,于是从大到小放,又因为只能是奇数长度,所以每次会确定两个数。
考虑每次确定最大两个数的位置,
- 先将奇数放到 (1) ;
- 然后将奇数放到偶数前;
- 将两个数翻到 (2) 、 (3) 位;
- 翻转前三个数;
- 将目前位于 (12) 位的两数翻到序列末尾。
这样每两个数至多操作 (5) 次,总操作次数不超过 (frac52 n) 。