G
N
I
D
A
O
L

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\)

posted @ 2025-07-14 20:08  QWQcoding  阅读(21)  评论(0)    收藏  举报