系列trick - bitmask
系列trick - bitmask
拆位
主体思想:位之间不影响,把每一位拆开来考虑贡献,转化成非常容易考虑的 0/1。
首先要看出来位之间不影响,当题目涉及二进制运算时应当首先注意的就是这一点。
例题有一堆,这里拿最近做的一个举例子
CF1327F:这题给你若干个限制 ,表示 的区间AND和必须是 ;求满足条件长度为 ,并且每个数都 的序列数。
显然位独立,然后相当于限制区间都是 或者区间至少有一个是 。随便 dp 一下就可以计数了。然后把每一位的答案乘起来,就是最后的答案了。
例2:整数 求逆序对的神秘方法
从高到低来考虑,如果当前的位就能比较出结果(相当于一个01序列求逆序对, 开个cnt记一下即可),就计入答案;当前位相同的用分治的技巧分成两部分解决。复杂度是值域的 ,乘以 。
它看起来很傻逼,但是由于它拆位,支持更多操作(详见分治那篇里的题)
位运算优化(点少的)图操作
点少:指 可以通过。
主体思想:用位运算加速图的操作,以优化掉复杂度 卡常
讲道理,其实纸面复杂度没有被优化,只是把一些耗时间的操作交给 cpu 来搞了,比如把一个 的操作用位运算做掉,变成 “”
有啥用呢? 的时候, 的复杂度多一个 都是过不去的。
比如,可以把每个点的出边压成一个集合,然后每次把当前的状态跟它或以下,就可以实现搜索中的 “扩展”。
例1 判断强连通, :这个题 的 分, 的做法。
例2 例1的100分 (这个还涉及到筛法,见下一个trick)
位筛
主体思想:筛法,定义域为二进制压缩的集合
这类问题时间复杂度通常会有保证:每个集合只会被筛一次,复杂度是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】