【题解】牛客练习赛41-D 最小相似度

题目链接

\(\text{Solution:}\)

首先考虑我们到底要求啥,实际就是要快速求出对于一个数 \(x,\) 所有数与它异或后的 SIM 值。

一种 naive 的想法是直接枚举 \(T,\) 显然复杂度爆炸,因为 \(n\) 太大了,是 \(O(2^m\times n)\) 的。

考虑把 \(n\) 干掉,倒着想。题目的描述引导我们去二分答案。

设当前答案是 \(mid,\) 目标就是看是否存在一个 \(x\) 满足最大 SIM 不超过 \(x.\)

考虑设 \(f_x\) 表示 \(x\) 在二进制下 \(0\) 的个数,寻找一个逆向的突破口:

不能直接枚举 \(x,\) 考虑什么情况下我们可以知道存在这样一个 \(x.\)

那么发现,每个数 \(v_i\) 在经过变换后的值就是 \(v_i\text{ xor } x,\) 那不妨从这个最终状态出发。

考虑预处理出所有二进制下 \(0\) 的个数等于 \(i\) 的数,那么设 \(g_x\) 表示 \(x\) 这个数是否有贡献,那么把 \(cnt\leq mid\) 的贡献都算上,现在我们就有了两个多项式:

\[f,g \]

那么设 \(c,c_x=\sum_{i\text{ xor }j=x}f_i\times g_j\)

那么存在一个 \(x\) ,就意味着 \(c_x=n,\) 因为这就等价于它对每个数都有贡献。

从上述做法就可以二分答案了。复杂度 \(O(m2^m\times \log m)\)

posted @ 2022-01-22 15:57  Refined_heart  阅读(33)  评论(0编辑  收藏  举报