CF878D Magic Breeding

发布时间 2023-07-20 17:31:49作者: Ender_32k

CF 评分有毒吧,暴力题上 *2900。

先口胡一下,代码等会再写。

首先考虑 \(a_{x,y}\in \{0,1\}\),那 \(n\) 个属性对应的人的状态只有 \(2^k\) 个,可以把状态相同的属性都合并成一个属性。

\(\max\)\(\min\) 操作就变成了两个人与/或起来。我们可以对每个属性都单独考虑。令 \(f_{i,S}\) 表示前 \(k\) 个人该属性状态为 \(S\),第 \(i\) 个人该属性的值。用 bitset 可以 \(O(\frac{2^kq}{w})\) 预处理。

然后考虑 \(a_{x,y}\in \mathbb{N^*}\),对于一个询问,离散化后 \(O(k)\) 枚举答案 \(x\)\(<x\) 的权值改为 \(0\)\(\ge x\) 的权值改为 \(1\)。因为这样的话取 \(0\)\(0\)\(\max\) 还是 \(0\),代表小于 \(x\) 的数和另一个小于 \(x\) 的数取最大还是小于 \(x\),另外三种情况同理。而权值改变后的答案已经预处理出来了,所以每次询问 \(O(k^2)\)

复杂度 \(O(q(\frac{2^k}{w}+k^2))\)


upd : 补上了评测记录

其实不用并查集合并相同属性,因为你对 \(2^k\) 种情况都预处理了,直接求出对应情况的答案即可。