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\)。
- \(e>n\)。由鸽巢原理无解。
- \(e = n\)。一棵基环树,由于点数与边数相等,可知只有两种选法:环的两个方向。树的部分只有离根方向去选。
- \(e = n - 1\)。一棵树,挑任意一个点不选,\(n\) 种选法。
C
对三角做对称,补全成带斜线的网格图,这样飞机相当于直着走到格点。对\((v_x, v_y)\) 约去公因子,问题转化为求一个最小正整数 \(t\) 使得:
这可以用 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})\) 可以通过。

浙公网安备 33010602011771号