【题解】P5355 [Ynoi2017] 由乃的玉米田

题意

P4688 [Ynoi2016] 掉进兔子洞

给定一个长为 n 的序列和 m 个操作,每次操作询问区间 [l,r] 内是否可以选出两个数 ax,ay,使得:

  1. axay=x

  2. ax+ay=x

  3. axay=x

  4. min(ax,ay)max(ax,ay)max(ax,ay)min(ax,ay)=x

n,m105,0x105,1ai105

思路

莫队 + bitset + 根号分治。

bitset 的基本用法

P3674 小清新人渣的本愿 的强化版。

不用修改,不强制在线,考虑 莫队 处理。

不妨令 N 为某一极大值,同时维护两个 bitset s1,s2,其中 s1 表示值 x 是否在当前区间内出现过,s2 表示值 Nx 是否在当前区间内出现过。

对于操作 1,如果 [l,r] 内存在 ab=x,因为 b 可以表示成 ax,所以 [l,r] 内也一定存在 a,ax,则问题转化成:是否可以在 [l,r] 内选出 a 使得 [l,r] 内同时存在 a,ax,可以用 s1[a] == s1[a - x] == true 判断。不难发现上面的代码等价于 (s1 & (s1 << x)).any()

对于操作 2,回顾 s2 的定义,发现 (s2 >> (N - x))[i] 实际上维护的是 [l,r] 内是否存在 (Ni)(Nx)=xi。故而我们可以用 (s1 & (s2 >> (N - x))).any() 判断 [l,r] 内是否存在 a+b=x。由于 bitset 不能维护负数下标,N 应该取到 105 及以上。

对于操作 3,因为 0x105,所以可以暴力枚举 x 的因数并用 s1 判断。

对于操作 4,发现难以直接用莫队维护。令 [l,r] 中的最大值为 k,因为当 xk 时,暴力枚举商为 x 的两个数复杂度是 O(n),所以可以考虑 根号分治

xk 时,暴力枚举商为 x 的两个数即可。

x<k 时,考虑 O(nn) 预处理答案。令 ai 的最大值为 K,不妨对于 1x<K 预处理 pipi=l 表示 [l,i] 内存在 ab=xil 最小。对于询问 [l,r] 内是否存在 ab=x,显然若 lpr 则存在,反之则不存在。

莫队部分时间复杂度 O(nn),根号分治时间复杂度 O(nn),因此总时间复杂度 O(nn)

代码

posted @   kymru  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
主题色彩