[题解] Interval GCD
题目描述
给定一个数列\(A\),有\(m\)次操作,分为两种:
- 询问\([l, r]\)内所有数的\(gcd\)
- 给\([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的处理,没有考虑差分

浙公网安备 33010602011771号