Loading

关于 bitset 的妙用

例题:

给定一个 \(n\) 个点,\(m\) 条边的 \(DAG\),进行 \(q\) 次询问,每次询问给定 \(s,t,l,r\) 。问若只保留 \([l,r]\) 之间的边,\(s\) 能否到达 \(t\)

\(1\le n,q\le 5\times 10^4,1\le m\le 10^5,1024MB\)

经典的 bitset 优化

首先考虑一个弱化版的,经典的问题:每次询问 \(s,t\) ,问 \(s\) 能否到达 \(t\)

发现很难(或无法)用其他方法进行优化,况且这数据范围一看就很 bitset ,于是可以用 \(f(i,j)\) 表示 \(i\to j\) 的连通性。那么可以在拓扑排序时转移:\(f(v)|=f(u)\)

回到这题,我们发现是否需要多加一维:\(f(i,j,k)\) 表示在满足询问 \(k\) 的限制下,\(i,j\) 的连通性

答案是__不需要__,我们可以重新定义 \(i\),合并 \(i,k\) 的意义,表示在第 \(i\) 个限制下,从 \(s_i\) 出发,与 \(j\) 的连通性

这样就可以转移了,转移时还需 \(and\) 上一个 \(mask\) :bitset \(g(u, v)\) 表示边 \((u, v)\) 在各个限制 \([l_i,r_i]\) 中是否存在。转移即为 \(f(v) |= g(u,v)\ and\ f(u)\)

题外话

这里蒟蒻还记录一个考场上的另一道题的做法 QwQ,就是把这道题的 \(DAG\) 改成普通无向图。

考虑回滚莫队+可持久化并查集(很无脑很暴力的做法),每次在一个块内右端点用并查集朴素拓展,左端点回滚到块的右端点,在上一个版本基础上拓展。

时间复杂度 \(O(2n\sqrt{q}\log^2q)\)

posted @ 2024-11-09 17:36  慕斯ひいきする  阅读(47)  评论(0)    收藏  举报