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

题目链接

Solution:

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

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

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

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

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

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

那么发现,每个数 vi 在经过变换后的值就是 vi xor x, 那不妨从这个最终状态出发。

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

f,g

那么设 c,cx=i xor j=xfi×gj

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

从上述做法就可以二分答案了。复杂度 O(m2m×logm)

posted @   Refined_heart  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示