系列trick - bitmask

拆位

主体思想:位之间不影响,把每一位拆开来考虑贡献,转化成非常容易考虑的 0/1。

首先要看出来位之间不影响,当题目涉及二进制运算时应当首先注意的就是这一点。

例题有一堆,这里拿最近做的一个举例子

CF1327F:这题给你若干个限制 \((l,r,x)\),表示 \([l,r]\) 的区间AND和必须是 \(x\);求满足条件长度为 \(n\),并且每个数都 \(<2^k\) 的序列数。

显然位独立,然后相当于限制区间都是 \(1\) 或者区间至少有一个是 \(0\)。随便 dp 一下就可以计数了。然后把每一位的答案乘起来,就是最后的答案了。

代码

例2:整数 求逆序对的神秘方法

从高到低来考虑,如果当前的位就能比较出结果(相当于一个01序列求逆序对, 开个cnt记一下即可),就计入答案;当前位相同的用分治的技巧分成两部分解决。复杂度是值域的 \(\log\),乘以 \(n\) 。

它看起来很傻逼,但是由于它拆位,支持更多操作(详见分治那篇里的题)

位运算优化(点少的)图操作

点少:指 \(2^n\times ...\) 可以通过。

主体思想:用位运算加速图的操作,以优化掉复杂度 卡常

讲道理,其实纸面复杂度没有被优化,只是把一些耗时间的操作交给 cpu 来搞了,比如把一个 \(O(n)\) 的操作用位运算做掉,变成 “\(O(1)\)”

有啥用呢?\(n=24,25\) 的时候,\(2^n\) 的复杂度多一个 \(n\) 都是过不去的。

比如,可以把每个点的出边压成一个集合,然后每次把当前的状态跟它或以下,就可以实现搜索中的 “扩展”。

例1 判断强连通,\(n\le 24\) :这个题 的 \(60\) 分,\(O(2^n n)\) 的做法。

例2 例1的100分 (这个还涉及到筛法,见下一个trick)

位筛

主体思想:筛法,定义域为二进制压缩的集合

这类问题时间复杂度通常会有保证:每个集合只会被筛一次,复杂度是 \(O(2^n)\)

详见这篇文章

系列trick - bitmask的更多相关文章

  1. 系列trick - 随机

    系列trick - 随机 不断更新中,欢迎来提供idea 随机的字符串 出现次数 \(\ge 2\) 的子串期望长度是 \(\log n\) 两个随机串的期望LCP,LCSuf,LCSub长度是 \( ...

  2. 系列trick - 建图

    对偶图 主体思想:平面图的割,等价于对偶图的路 例题:[BeiJing2006]狼抓兔子 网上有114514篇题解,这里不赘述 点变边 主体思想:点带点权,而要在点上实现一些在边上的问题,比如最小割点 ...

  3. 解读ASP.NET 5 & MVC6系列(8):Session与Caching

    在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了ASP.NET 5中一个可配置的模 ...

  4. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

  5. Java多线程系列--“JUC集合”08之 LinkedBlockingQueue

    概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...

  6. Java多线程系列--“JUC集合”09之 LinkedBlockingDeque

    概要 本章介绍JUC包中的LinkedBlockingDeque.内容包括:LinkedBlockingDeque介绍LinkedBlockingDeque原理和数据结构LinkedBlockingD ...

  7. Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue

    概要 本章对Java.util.concurrent包中的ConcurrentHashMap类进行详细的介绍.内容包括:ConcurrentLinkedQueue介绍ConcurrentLinkedQ ...

  8. Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  9. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数006, image,影像处理(像素图)

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数006, image,影像处理(像素图) 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“* ...

随机推荐

  1. 多线程写法,消除同步bug

    public class Demo01 implements Runnable { private int ticket = 10; @Override public void run() { for ...

  2. MongoDb学习(五)--Gridfs--上传下载

    版本 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spri ...

  3. Java学习日报7.8

    public class 定义要求文件名和类名保持一致,一个*.Java文件只允许有一个public class定义! 主方法是一切程序的起点, public static void main(Str ...

  4. pixi.js 图像资源(svg)转纹理

    当Pixi使用WebGL去调用GPU渲染图像时,需要先将图像转化为GPU可以处理的版本.而能够被GPU处理的图像就叫做纹理,在pixi中使用纹理缓存来存储和引用所有纹理.通过将纹理分配给精灵,再将精灵 ...

  5. Spark算子使用

    一.spark的算子分类 转换算子和行动算子 转换算子:在使用的时候,spark是不会真正执行,直到需要行动算子之后才会执行.在spark中每一个算子在计算之后就会产生一个新的RDD. 二.在编写sp ...

  6. scala模式匹配 case a @ b语法

    class caseTest { def main(args: Array[String]): Unit = { val c = Person(Student(1),"a") c ...

  7. 数仓面试高频考点--解决hive小文件过多问题

    本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...

  8. 【函数分享】每日PHP函数分享(2021-1-7)

    ltrim() 删除字符串开头的空白字符(或其他字符). string ltrim ( string $str[, string $character_mask]) 参数描述str 输入的字符串. c ...

  9. k8s中教你快速写一条yaml文件

    一条yaml中有很多字段,如果去背这些字段,其实也能背过,但是去写一条yaml,也往往浪费很多的时间,也会出错,其实我们可以用一条命令就能快速来写一段自定义的yaml,工作中去修改相应的yaml也得心 ...

  10. 使用call、apply、bind继承及三者区别

    js里的继承方法有很多,比如:使用原型链的组合继承.es6的Class.寄生继承以及使用call.apply.bind继承.再说继承之前,我们先简单了解下它们的区别. 一.区别: 同:三者都是改变函数 ...