专栏文章

PKUWC2025 D2T3 题解

个人记录参与者 5已保存评论 4

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
4 条
当前快照
1 份
快照标识符
@miqdza24
此快照首次捕获于
2025/12/04 03:14
3 个月前
此快照最后确认于
2025/12/04 03:14
3 个月前
查看原文
重生之随便写个暴力成为全场唯一通过。
考虑操作逆序,+1,1+1,-1 互换,乘以 kk 变成整除 kk
考察什么样的数可以由 lrl\sim r 做不超过 BB 次操作得到,可以发现只有在形如 [max(l/yB,1),r/y+B][\max(l/y-B,1),r/y+B] 这样的区间里的数可以被取到,其中 yy 是正整数。(这里不要求整除)
设这些区间的并为集合 SS,可以发现集合 SS 有这样的性质:对于任意 zSz\in S,任意 wzw \mid z 也满足 wSw\in S。证明就是考虑取出任意一个包含 zz 的区间 [l/yB,r/y+B][l/y-B,r/y+B],设 z=awz=aw,那么 w[l/(ay)B,r/(ay)+B]w\in [l/(ay)-B,r/(ay)+B]
考虑分析集合 SS 的大小,对 yy 进行分类讨论。
对于 y>r/By> \sqrt{r/B},我们有 r/y+B<Br+Br/y+B<\sqrt{Br}+B
对于 yr/By\leq \sqrt{r/B},直接计算区间长度之和:
y=1r/B(rly+O(B))=O((rl)ln(rl)+Br)\sum_{y=1}^{\sqrt{r/B}}\left(\frac{r-l}{y}+O(B)\right)=O((r-l)\ln(r-l)+\sqrt{Br})
因此 SS 的大小是 (rl)ln(rl)+Br(r-l)\ln(r-l)+\sqrt{Br} 级别。
求出 SS 集合内的所有数可以直接暴力枚举小的 yy,然后拼上 Br+B\sqrt{Br}+B 内的所有数,因为区间关于 yy 单调所以去重是简单的。
求出 SS 集合后,考虑怎么做原问题。
暴力怎么做,维护 1r+B1\sim r+B 的答案,BB 次狄利克雷前缀和直接转移。
因为这题做法是暴力,所以还是狄利克雷前缀和直接转移。
现在就有两个问题,一个是怎么求出所有刚好差了质数倍的转移对 u,vu,v,另一个是分析总对数的级别。
考虑把 SS 集合分成两部分,把 >Br>\sqrt{Br} 的称为大集合,反之称为小集合。
小集合内的转移数显然不超过 Brloglogr\sqrt{Br}\log\log r,且容易求出,而大集合内每个数对应的 yy 都不超过 r/B\sqrt{r/B},因此它一定是 [lBr,r+Br][l-\sqrt{Br},r+\sqrt{Br}] 内某个数的因数。
因此我们只需对这个区间跑区间筛,然后只需要解决对于一个集合内的 uu,定位 u/pu/p 在集合里的位置。
可以发现只需要知道 uu 所在区间的 yy,并记录每个 yy 对应的区间左端点位置即可,复杂度应该是 O(1)O(1) 的。
听说转移数可以分析出是 Sloglogr|S|\log\log r,但是我没学会。
这样的总复杂度就是 O(B(Br+(rl)ln(rl))loglogr)O(B(\sqrt{Br}+(r-l)\ln (r-l))\log \log r),可以通过。
不过我赛时写的是对每个区间区间筛,还有一百万个 map 去重,这样居然也通过了。

评论

4 条评论,欢迎与作者交流。

正在加载评论...