Codeforces Round # 740 (Div.2) 比赛总结

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. 先将奇数放到 \(1\)
  2. 然后将奇数放到偶数前;
  3. 将两个数翻到 \(2\)\(3\) 位;
  4. 翻转前三个数;
  5. 将目前位于 \(12\) 位的两数翻到序列末尾。

这样每两个数至多操作 \(5\) 次,总操作次数不超过 \(\frac52 n\)

posted @ 2021-08-25 10:59  Kelvin2005  阅读(66)  评论(1编辑  收藏  举报