Loading

P5502 [JSOI2015]最大公约数

\(\text{solution}\)

感觉分治的题目也很好啊 qwq。

就是你考虑一个区间 \([l, r]\) 里的子区间有几种情况,设 \(mid = \frac{l + r}{2}\)

  • 左右端点全在 \([l, mid]\) 中。
  • 左右端点全在 \([mid + 1, r]\) 中。
  • 左右端点跨 \(mid\)

对于前两种情况我们可以分治去做。我们考虑第三种情况怎么解决。

我们发现,可以左右端点从 \(mid\) 开始,\(j\) 依次加一,然后 \(i\) 寻找最大公约数等于原来的扩展就行了,显然证明这个贪心是正确的。对于左端点也要依次扩展。

然后这个的复杂度非常妙啊,假设 \(\gcd\) 的复杂度为常数 \(z\),那么明显我们在扩展的时候需要用到这个 \(z\),由于一共有 \(\log\) 层,每层的长度都是 \(n\),所以复杂度为:\(O(zn\log_2n)\),复杂度不大。

posted @ 2023-06-16 17:13  Alexande  阅读(25)  评论(0)    收藏  举报