Pinely Round 4 (Div. 1 + Div. 2) VP记录

Pinely Round 4 (Div. 1 + Div. 2) VP记录

场上打了 ABCDF,被 E 二粉兔创飞了。

这场的构造题有:B D E G I,乐死了。

A

把数列黑白染色,第一个格为黑色,那么每次删除会删除一个黑格子和一个白格子。而黑格子始终比白格子多一个,因此最后选到的是黑格子。答案极为黑格子的最大值,也易证一定存在这样的构造。

B

我发现这种位运算构造是我的弱势区。很逆天的写了 25 分钟,相比下 C 写了 5 分钟。

一开始初始化所有 \(a\)\(0\),枚举 \(b_i\) 后令 \(a_{i}\)\(a_{i + 1}\) 按位或上当前的 \(b_i\) 即可。

C

每次用最大值和最小值的 mid 操作,这样每次操作后值域会减半。

最后检查数组是否全为 \(0\) 判掉无解即可。

D

考虑把数分为奇数和偶数两类。

质数除了 \(2\) 都是奇数。同奇偶性异或同奇偶性是偶数否则是奇数。

如果把 \(2\) 看成合数,那这张图是二分图,这个时候可以黑白染色。

但实际上不行,因为有 \(2\) 的参与。

如果两个数字异或起来等于 \(2\),那么这两个数字不能是同色。也就是,对于一组数 \(a, a + 1, a + 2, a + 3\),其中 \(a\)\(4\) 的倍数,第一个数和第三个数不能同色,第二个数和第四个数不能同色。

所以一定能四染色,\(i\) 号点染 \((i \bmod 4) + 1\) 即可。

E

为什么我 D 能想到二分图但是 E 想不到呢。。

注意到如果题目不是二分图,它不能进行二染色,那么我们只要选 Alice 后一直给Bob 同样的两种颜色逼着 Bob 要对一个非二分图二染色,然后就赢了。

否则选 Bob 能必胜。考虑二分图的左部点和右部点,各给它们一种颜色对应。那么 Alice 的三选二必然会给出一种对应一部分的颜色,那么如果这个时候那部分点还有剩就直接拿出来染成对应颜色就行了,否则把另一部分染成 Alice 给的 另一种颜色。

F

判能不能形成三角形,一般有个折半 trick。

就是,将一个区间的小棒长度排序后,从大到小看,如果当前最大的三个数不能组成三角形,也就是 \(a_i \ge a_{i - 1} + a_{i - 2} \implies a_i \ge 2a_{i - 2}\),所以两步后值域减半。

然后这个数列最坏情况是斐波那契数列,所以大概看看如果区间长度大于 \(50\) 就一定可以组成两个三角形。(场上我用的 \(100\) 判断,因为没细分析)

那么区间长度小于 \(50\) 了,就可以随便做了,好像有人 \(O(k^3)(k = 50)\) 过了。

但是有 \(O(k)\) 的做法。首先先尝试拿走最大的三角形后能否再拿一个,先把这种情况判掉。

如果不行,那有可能是两个三角形卡在一起了,例如样例的 \([5, 2, 2, 10, 4, 10]\)

那么因为我们排序了,所以如果存在这种情况,必定能在一段连续的 \(6\) 根小棒中找到,所以对 \(\binom{5}{2}\) 种情况暴力判断一下即可。

G

把原图分成这样的四个区域。

令水平操作只放在左侧 \(k\) 列,垂直操作只摆在上方 \(k\) 列。

如果左下角区域和右上角区域没填完,就优先填这两块区域,否则填左上角的区域,优先填能导致消除的区域。

感性理解或者手摸一下,这么填能进行任意多次操作。(不是很会证明,但是自己在图上玩一下就大概感觉出它是对的)

然后模拟这一过程即可,这题变成了大模拟,但是也没那么大模拟。

暴力改能单次询问询问 \(O(nm)\),随便过了。

H

很困难的博弈题,难度 \(\textcolor{black}{3}\textcolor{red}{328}\)\(\texttt{Clist}\) 数据)。

大概理解题解后有点乱好像不是很能写出来,决定跟着 CF 的 Hint 走一遍,整理下思路然后补一下。

Hint 1

Consider which pairs of numbers an odd number can be split into. What about an even number?

想想奇数可以分成哪几对数?那么偶数呢?

首先,奇数加奇数等于奇数,所以奇数 \(x\) 只能拆成 \(2 + (x - 2)\)

而偶数的情况,根据强哥德巴赫猜想,任何一个不小于 \(6\) 的偶数都可以分解为两个奇质数相加。

Hint 2

Consider a simplified version of the game with only two piles of stones, where the first pile contains \(x\) stones, and the second pile contains one stone. Determine all winning positions for this game configuration.

考虑一个只有两堆棋子的简化版对局,其中第一堆有 \(x\) 颗棋子,第二堆有一颗棋子。请确定这种棋局配置的所有获胜情况。

因为 \(1\) 是永远拆不开的,所以只能拆开 \(x\) 扔掉 \(1\)。然后对 \(x\) 分类讨论。

\(f(x)\) 为在这种对局下的胜负状态,\(f(x) = 1\) 代表先手必胜,\(f(x) = 0\) 代表先手必败。

首先考虑在 Hint 1 没讨论过的边界情况,有:\(f(1) = 0, f(2) = 0, f(4) = 1\)

然后讨论奇数,奇数拆分的情况是固定的。

所以,如果 \(x - 2\) 不是质数,那么 \(x\) 拆不掉,\(f(x) = 0\),否则 \(f(x) = \neg f(x - 2)\)

然后讨论偶数,偶数拆分完为两个奇数。

如果 \(x\) 的存在一种拆分方法 \(x = u + v, u \in \text{Prime}, v \in \text{Prime}\) 都有 \(f(u) = f(v) = 0\),那么先手用这种方法把 \(x\) 拆开后后手面临必败局面,所以 \(f(x) = 1\)

否则,对于 \(x\) 的所有的拆分方案都有 \(f(u) = 1 \vee f(v) = 1\),此时 \(f(x) = 0\)

Hint 3

For the simplified version of the game, given that we have calculated the odd \(x\) which are losing positions, we can quickly determine the winning positions for even \(x\) using Fast Fourier Transform or bitset operations.

对于简化版的游戏,鉴于我们已经计算出奇数 \(x\) 的输棋位置,我们可以使用 FFT 或 bitset 运算快速确定偶数 \(x\) 的赢棋位置。

用 bitset 优化 01 卷积。枚举 \(f(v) = 0\) 的位置,则把原本的 \(f\) 取反左移后或一下即可。

Hint 4

We can determine the winner of most games by considering how many \(a_i\) are in winning positions and whether \(n\) is odd or even.

我们可以通过考虑有多少 \(a_i\) 处于获胜位置以及 \(n\) 是奇数还是偶数来确定大多数对局的胜负。

考虑终止必败态。当当前数列中所有数的 \(f\) 值都为 \(0\),那么先手必败。

那么在大部分情况下,假设场上出现了 \(f\) 值为 \(1\) 的数,那么先手必胜,先手的策略是,一次操作取完所有 \(f\) 值为 \(1\) 的数,此时取的数要么都为 \(1\),要么恰好包含一个 \(0\),这个时候可以把那个 \(0\) 和一半的 \(1\) 删除,剩下的 \(1\) 拆成两个 \(0\),就把必败态扔给了对手,先手必胜。

为什么是大部分情况呢?注意到如果 \(n\) 为奇数并且此时局面全为 \(1\) 的时候,先手没法一次操作把所有 \(1\) 给清掉,这种情况下胜负判断会变得复杂一点。

Hint 5

For games where we currently cannot determine the winner, we can use the number of \(a_i\) that can be split into two winning positions to determine the final winner.

对于目前无法确定胜负的棋局,我们可以使用可以分成两个必胜位置的 \(a_i\) 的数量来确定最后的胜负。

在这一部分只讨论上面的特殊情况。如果先手操作后出现了 \(0\) 那就没救了,后手直接取走所有 \(1\) 就赢了。注意到每次操作后的 \(n\) 保持不变,所以先手救急的机会就是找到一种方法把局面中所有能拆成两个的 \(1\) 的数拆成两个 \(1\),然后把这种状态给到后手。

如果一个数能被拆成两个 \(1\),首先这个数不能是奇数,因为 \(f(2) = 0\)。因此这个数为偶数,拆成的两个 \(1\) 为奇数,不可能再拆成两个 \(1\)

因此如果先手救急成功了就赢了。

\(g(x)\) 表示 \(x\) 是否能拆成两个 \(1\) 点。如果局面上所有数的 \(g(x)\) 都是 \(0\),则先手必败。如果局面上同时的 \(g(x)\)\(1\) 的数和 \(g(x)\)\(0\) 的数,那么先手必胜,因为先手能一步把所有的 \(g(x) = 1\) 的点拆开。否则,局面上所有数的 \(g(x)\) 都为 \(1\),先手没法一次操作拆开所有的 \(1\),而先手又不能不操作,因此先手必败。\(g\) 也是可以通过 bitset 优化下卷积得到的。

按着这些条件判即可。

I

补牛魔。

posted @ 2024-08-27 18:29  AzusidNya  阅读(21)  评论(0)    收藏  举报