Ynoi选做
P5313 [Ynoi2011] WBLT
题面:
给你一个长为 \(n\) 的序列,有 \(m\) 次查询操作。
每次查询操作给定参数 \(l,r,b\),需输出最大的 \(x\),使得存在一个 \(a\),满足 \(0\leq a<b\),使得 \(a,a+b,a+2b,…,a+(x−1)b\) 都在区间 \([l,r]\) 内至少出现过一次。
如果不存在 \([0,b−1]\) 内的数,则输出 \(0\) 。
所有数 \(\leq 10^5\)。
题解:
分块。
使用手写bitset维护区间出现的值域,设其块长为 \(\omega\)。
若当前询问 \(b\ge \omega\) ,考虑将将bitset每 \(b\) 位分成一组,共 \(V\over b\) 组,将这些小的bitset从前往后按位与,直到变为全 \(0\) 即找到答案。
若当前询问 \(b\leq \omega\) ,这样的 \(b\) 不多,单独把它们拎出来按照每个不同的 \(b\) 进行处理。对于一个 \(b\) ,用莫队维护区间 \([l,r]\) 中的 \(b\) 个bitset,每个 bitset 是一个剩余类,找到每个 bitset 最小的 \(0\) 位并取最大值即可。
取 \(\omega=64\) 。

浙公网安备 33010602011771号