CF1515H
代码是半成品,调自闭了。
大概是一个暴力思路(不保证正确,复杂度比较劣,不保证能过(本来想试试,然后调自闭了),没写完,纯口嗨,错了不负责),学会了正解再来补好了。
考虑暴力,我们将二进制位拆成前 w−cnt 位和后 cnt 位。
这里只讨论 OR 和 XOR 的情况,AND 和 OR 类似。
我们考虑枚举前 w-cnt 位,先考虑 XOR:
散块的部分我们暴力,对于整块我们进行分类:
- 空块。
- 非空块。
对于 XOR 而言,i\to j 则 j\to i,于是相当于 swap(如果都被操作)
否则为 i\to j
若 i,j 均非空,则暴力,此时至少会减少一个非空块。
如果 j 为空,则直接将 j 这个块设为 i 即可。
显然一次操作最多增加两个非空块(由散块提供)
对于其中第二类情况,我们做 \mathcal O(2^{cnt}) 的暴力即可,复杂度显然为 \mathcal O(q(2^{cnt}+2^{w-cnt})),然后我们对于一个整块打一个 XOR 的标记即可。
对于 OR,我们仍然类似处理,现在考虑如何处理 OR 的标记。
我们考虑一个 sub pro,维护集合,支持 OR 和 XOR,每次操作后输出集合大小,q\le 10^7,w\le 10
可以这样做,我们维护一个长为 w 的数组,表示每个位有没有被 OR 1 过,每次如果增加了一个 OR 1 的位,我们就暴力重构,否则我们维护一个先 or 上 Z 再 xor 上 X 的标记即可。复杂度显然为 \mathcal O(q+w2^w)
于是对于 OR,我们仍然是散块暴力,非空 & 非空暴力,非空到空的类型则直接做上述算法即可。
显然每次重构,会增加 cnt 个标记,复杂度为 \mathcal O(q(cnt2^{cnt}+2^{w-cnt}))
可以在 \mathcal O(q\sqrt{w2^w}) 的复杂度解决本题。
Code:
想欣赏 6kb 代码不能过手造样例吗?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp