20250302 总结
A
简化题意:对一个长度为 n n n 的序列 a a a 支持区间加与查询区间 gcd 操作。
思路:首先老师给了个结论,对于 a a a 的一个子序列 a l ∼ a r a_l\sim a_r al∼ar,有:
gcd ( a l , a l + 1 , ⋯ , a r ) = gcd ( a l , a l + 1 − a l , a l + 2 − a l + 1 , ⋯ , a r − a r − 1 ) \gcd (a_l,a_{l+1},\cdots,a_r)=\gcd (a_l,a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1}) gcd(al,al+1,⋯,ar)=gcd(al,al+1−al,al+2−al+1,⋯,ar−ar−1)
我们把后式进行如下拆分:
gcd ( a l , a l + 1 − a l , a l + 2 − a l + 1 , ⋯ , a r − a r − 1 ) = gcd ( a l , gcd ( a l + 1 − a l , a l + 2 − a l + 1 , ⋯ , a r − a r − 1 ) ) \gcd (a_l,a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1})=\gcd (a_l,\gcd (a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1})) gcd(al,al+1−al,al+2−al+1,⋯,ar−ar−1)=gcd(al,gcd(al+1−al,al+2−al+1,⋯,ar−ar−1))
发现 gcd ( a l , a l + 1 − a l , a l + 2 − a l + 1 , ⋯ , a r − a r − 1 ) \gcd (a_l,a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1}) gcd(al,al+1−al,al+2−al+1,⋯,ar−ar−1) 只和 a a a 的差分序列有关。设 b b b 为 a a a 的差分序列,即 b i = a i − a i − 1 b_i=a_i-a_{i-1} bi=ai−ai−1(默认 a 0 a_0 a0 为 0 0 0),则每次对 a l ∼ a r a_l\sim a_r al∼ar 加 d d d 的操作,只会影响 b l b_l bl 和 b r + 1 b_{r+1} br+1 的值,即 b l ← b l + d , b r + 1 ← b r + 1 − d b_l\gets b_l+d,b_{r+1}\gets b_{r+1}-d bl←bl+d,br+1←br+1−d,查询时即求 gcd ( b l + 1 , b l + 2 , ⋯ , b r ) \gcd (b_{l+1},b_{l+2},\cdots,b_r) gcd(bl+1,bl+2,⋯,br)。这一部分可用线段树维护,复杂度 O ( n log 2 n ) \Omicron (n\log_2 n) O(nlog2n)。
剩下的 a l a_l al 怎么求?显然 ∑ i = 1 l b i = ∑ i = 1 l a i − a i − 1 = a l \sum\limits_{i=1}^{l}b_i=\sum\limits_{i=1}^{l}a_i-a_{i-1}=a_l i=1∑lbi=i=1∑lai−ai−1=al。我与上一部分分开用树状数组维护的,时间复杂度亦为 O ( n log 2 n ) \Omicron (n\log_2 n) O(nlog2n)。
细节及难点:没什么难点,注意我们对于修改 a l ∼ a r a_l\sim a_r al∼ar 的操作实际修改了 b l , b r + 1 b_l,b_{r+1} bl,br+1,如果没判 r + 1 ≤ n r+1\le n r+1≤n 的话建树时需要建到 n + 1 n+1 n+1。
B
简化题意:
思路:
细节及难点:
核心代码:
C
简化题意:
思路:
细节及难点:
D
简化题意:
思路:
细节及难点:
E
简化题意:
思路:
细节及难点:
F
简化题意:
思路:
细节及难点:
G
简化题意:
思路:
细节及难点: