Codeforces Round 1021 (Div. 1) 解题报告

Codeforces Round 1021 (Div. 1)

A

先统计每个 \(a_i\) 出现了多少次,随后倒序对所有位置进行考虑。如果当前 \(a_{i + 2}\) 没有限制,则 \(a_i = 1\) 无用,\(a_i = 2,3\) 老师可以强制让 \(a_{i+1}\) 带上限制,\(a_i\) 出现了四次以上,直接判老师赢。如果当前 \(a_{i + 2}\) 有限制,则 \(a_i = 1\) 就可以让 \(a_{i+1}\) 带上限制,\(a_i\) 出现了两次以上,直接判老师赢。

B

如果有 \(p_i\)\(p_{i + 1}\) 的曼哈顿距离不为 \(2\) 的直接无解。否则 \(p_i\)\(p_{i + 1}\) 的位置关系要么同一条线隔一个格子,要么斜着差一格。前者必选中间那格,后者二选一,可以两个格子作为顶点,中间连一条边建图。

问题转化为这个图每条边选一个顶点,顶点只能最多选一次,有几种选法。可以对每一个连通块单独考虑。假设某个连通块点数为 \(n\) 边数为 \(e\)

  1. \(e>n\)。由鸽巢原理无解。
  2. \(e = n\)。一棵基环树,由于点数与边数相等,可知只有两种选法:环的两个方向。树的部分只有离根方向去选。
  3. \(e = n - 1\)。一棵树,挑任意一个点不选,\(n\) 种选法。

C

对三角做对称,补全成带斜线的网格图,这样飞机相当于直着走到格点。对\((v_x, v_y)\) 约去公因子,问题转化为求一个最小正整数 \(t\) 使得:

\[\begin{aligned} x + v_xt \equiv 0 (\bmod n) \\ y + v_yt \equiv 0 (\bmod n) \end{aligned} \]

这可以用 EXCRT 求出。随后求反弹次数,也即跨越了网格以及斜线的次数,均容易化为坐标的表示。

D

先拆成 \(n = m \cdot 2^k\),其中 \(m\) 是奇数。最小的分拆如此。

随后发现结论,\(s\) 能化为 \(t\) 当且仅当 \(s\)\(t\) 看作 \(2^k\) 个长为 \(m\) 的位串时线性基等价。

那么就求线性基,时间复杂度 \(O(m2^k\min(m,2^k))\)。这是根号级别,但是可以利用总所周知的 bitset 优化,\(O(\dfrac{n^{1.5}}{w})\) 可以通过。

posted @ 2025-06-15 10:56  Vizing  阅读(40)  评论(0)    收藏  举报