[题解] Interval GCD

题目描述

给定一个数列\(A\),有\(m\)次操作,分为两种:

  1. 询问\([l, r]\)内所有数的\(gcd\)
  2. \([l, r]\)内所有数加上\(d\)

显然,根据\(gcd\)的性质,它是很容易进行区间合并的,所以询问很好实现。

那么,瓶颈就在于操作二

这是区间操作,按照线段树的套路,我们可能会选择使用lazy tag

但是思考很久无果后,我们尝试转换思路

我们考虑题目的弱化版本,将区间加改为单点加,问题就很简单了。

所以,问题转变为如何将区间加转化为单点加,于是 ---- 差分

但是,差分后怎么求\(gcd\)
于是,我们再次考虑\(gcd\)的性质,有\(gcd(a, b) = gcd(a, b - a)\)
于是,我们猜测,\(gcd(a, b, c, d, \cdots) = gcd(a, b-a, c-b, d-c, \cdots)\)
证明是显然的。
那么,我们就可以维护差分数组上的\(gcd\),再维护前缀和以得到原数列中的值,这道题就做完了。

总结

区间加转化为单点加 \(\longrightarrow\) 差分
\(gcd(a, b) = gcd(a, b - a)\)

My Problem: 拘泥于线段树对区间操作lazy tag的处理,没有考虑差分

posted @ 2025-09-18 20:32  zhm0725  阅读(17)  评论(0)    收藏  举报