专栏文章

题解:CF1732E Location

CF1732E题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@min7rscz
此快照首次捕获于
2025/12/01 21:57
3 个月前
此快照最后确认于
2025/12/01 21:57
3 个月前
查看原文
首先 lcm(a,b)gcd(a,b)=abgcd2(a,b)\cfrac{\operatorname{lcm}(a,b)}{\gcd(a,b)}=\cfrac{ab}{\gcd^2(a,b)}
故当 gcd(a,b)\gcd(a,b) 一定时,abab 最小会使原式最小。
考虑使用线段树维护。那么对一个结点赋值时,我们就要考虑区间中的 bbxx 构成最小值。
gcd(x,b)\gcd(x,b) 显然为 xx 的因数,考虑枚举 xx 的因数 kk,计算 gcd(x,b)=k\gcd(x,b)=k 的结果。
此时统计所有 kk 的倍数,取最小的即可。因为此时 gcd(x,b)\gcd(x,b) 一定是 kk 的倍数,而当 gcd(x,b)>k\gcd(x,b)>k 时,我们一定会在更大的 kk 找到更小的答案。所以这样放宽限制是可以的。
对于 kk 的倍数的枚举,不难想到阈值分治。设阈值为 BB
  • 对于 kBk \ge B,我们枚举其所有的 O(V/B)\mathcal{O}(V/B) 个倍数,二分一下找区间中有没有这个数,这部分复杂度为 O(VlognB)\mathcal{O}(\cfrac{V\log n}{B})
  • 对于 k<Bk<B,考虑直接在线段树上维护结果,只需简单预处理即可,共有 O(nB)\mathcal{O}(nB) 个数。
n,m,Vn,m,V 同阶,取 B=O(nlogn)B=\mathcal{O}(\sqrt{n }\log n),得时间复杂度为 O(nnlogn)\mathcal{O}(n\sqrt{n}\log n)。因为每次修改查询涉及 O(logn)\mathcal{O}(\log n) 个线段树上的结点。
然而 BB 需要开大,空间 O(nB)\mathcal{O}(nB) 差了点。
不妨对线段树底层分块,设块长为 KK。那么空间复杂度变为 O(nBK)\mathcal{O}(\cfrac{nB}{K})
如果单次 gcd\gcd 复杂度为 O(logn)\mathcal{O}(\log n)max{d(n)}=O(n1/3)\max \{d(n)\}=\mathcal{O}(n^{1/3}),考虑此时我们的时间复杂度:
  • 初始化:计算每个底层块的结果,每个块 O((n1/3+logn)K+B)\mathcal{O}((n^{1/3}+\log n)K+B)。向上合并时,复杂度为 O(nBK)\mathcal{O}(\cfrac{nB}{K})。总时间复杂度为 O(n4/3+nBK)\mathcal{O}(n^{4/3}+\cfrac{nB}{K})
  • 修改:散块部分单次 O(Klogn)\mathcal{O}(K \log n),整块部分单次 O((n1/3+nB)logn)\mathcal{O}((n^{1/3}+\cfrac{n}{B})\log n),分别是小因数和大因数的贡献。共计 O((nK+n2B+n4/3)logn)\mathcal{O}((nK+\cfrac{n^2}{B}+n^{4/3})\log n)
  • 查询:散块部分单次 O(Klogn)\mathcal{O}(K \log n),整块部分单次 O(logn)\mathcal{O}(\log n)。时间复杂度为 O(nKlogn)\mathcal{O}(nK \log n)
总时间复杂度为 O((n4/3+nK+nBK+n2B)logn)\mathcal{O}((n^{4/3}+nK+\cfrac{nB}{K}+\cfrac{n^2}{B})\log n)
B=O(n2/3),K=O(n1/3)B=\mathcal{O}(n^{2/3}),K=\mathcal{O}(n^{1/3}),总时间复杂度为 O(n4/3logn)\mathcal{O}(n^{4/3}\log n),空间复杂度为 O(n4/3)\mathcal{O}(n^{4/3})
当单次 gcd\gcd 做到 O(1)\mathcal{O}(1) 时,时间复杂度应该为 O(n4/3log2/3n)\mathcal{O}(n^{4/3}\log^{2/3} n)
较题解区其他人复杂度更优,不过可能有地方没分析到位。

评论

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

正在加载评论...