2025.2.03
A.长佳蕊 Mystery Square
根据数据范围可以想到折半,但和正常的折半好像不太相同。
如果高 \(\frac{n}{2}\) 位里不超过 20 个 ?
,把前 \(\frac{n}{2}\) 位确定了,后面全填 0 直接开根得到的数和答案相差很小,\(O(1)\) 枚举可以解决。
难点在于低 \(\frac{n}{2}\) 位里不超过 20 个 ?
,把低 \(\frac{n}{2}\) 位确定后,如何求出 \(\sqrt s\)。
首先把 \(s\) 末尾的 0 两两成对去掉(先开根开出去),因为保证有解,最后末尾剩下的一定是 1。
由于我们是根据去除完末尾的 0 剩下的二进制串进行分讨操作,所以我们要枚举最后有多少个零,不然会导致去除末尾 0 之后,初始确定的低 \(\frac{n}{2}\) 位不再是当前二进制串的低 \(\frac{n}{2}\) 位。
目前唯一的问题就是如何确定 \(\sqrt s\) 了。
若我们现在在确定 \(x=\sqrt s\) 的二进制低 \(i\) 位,也就是说第 \(1\sim i-1\) 位都确定好了,也就是说现在还能改变 \(x^2\) 低 \(i+1\) 位的只有尚未确定的 \(x\) 的低 \(i\) 位,而根据列竖式可得,那么 \(s\) 的低 \(i\) 位没有影响,向低 \(i+1\) 位进一,所以根据当前 \(x^2\) 和 \(s\) 的低 \(i+1\) 位是否相同来确定 \(x\) 低 \(i\) 位应该填什么。
感觉思维难度比较大。
B.有趣的游戏 Game of Slots
Alice 从小到大,Bob 从后往前田忌赛马这个策略比较显然。
值域 \(10^18\) 不好处理,肯定要离散化为 \([1,2n]\),这时候若不存在相同的数,每种情况都是等概率发生。若存在相同的数,会发现我们把存在相同的数的概率算大了。但是仔细一想会发现离散化前存在相同的数的概率约为 \(0.99999999999998010001\),乘了贡献变成期望之后也很小,对保留 \(6\) 位小数的答案没有任何影响,所以我们索性直接排除存在相同数的情况。
我到这里直接顺序搜索 Alice 分到了什么,Bob 分到的就是剩下 \(n\) 个数,很不好优化。
由 Bob 从后往前田忌赛马的策略,发现从后往前倒序确定每个数分配给谁就可以很好的 dp。
具体的,规定 \(0\) 代表分给 Alice,\(1\) 代表分给 Bob,设 \(f_{i,j,k}\) 为填了 \(i\) 个 \(0\),\(j\) 个 \(1\),Bob 还有 \(k\) 个 \(1\) 的 Alice 得分总和,\(g_{i,j,k}\) 代表方案数。
如果当前这个数填 \(1\)(分给 Bob),则 \(f_{i,j+1,k+1}\gets f_{i,j+1,k+1}+f_{i,j,k},g_{i,j+1,k+1}\gets g_{i,j+1,k+1}+g_{i,j,k}\)。
否则填 \(0\)(分给 Alice),若 \(k>0\),此时这个数会被 Bob 剩的数解决掉,\(f_{i,j+1,k-1}\gets f_{i,j+1,k-1}+f_{i,j,k},g_{i,j+1,k-1}\gets g_{i,j+1,k-1}+g_{i,j,k}\)。
否则 \(k=0\),不会被解决掉,Alice 在这一位 > Bob,获得贡献,\(f_{i+1,j,0}\gets f_{i+1,j,0}+f_{i,j,0}+(n-i)+times g_{i,j,0},g_{i+1,j,0}\gets g_{i+1,j,0}+g_{i,j,0}\)。
问题就解决掉了,难点好像并不在于 dp,虽然我是卡在 dp 上了。
C.矩阵 RowCol/ColRow Sort
若 \(\max{b_{i,j}}\le 1\),其实就是规定有若干个 \(1\) 的行有多少个,若干个 \(1\) 的列有多少个,这两个问题是分别独立的,多重集排列数之后乘起来。