20250302 总结

20250302 总结

A

简化题意:对一个长度为 \(n\) 的序列 \(a\) 支持区间加与查询区间 gcd 操作。

思路:首先老师给了个结论,对于 \(a\) 的一个子序列 \(a_l\sim a_r\),有:

\[\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 (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 (a_l,a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1})\) 只和 \(a\) 的差分序列有关。设 \(b\)\(a\) 的差分序列,即 \(b_i=a_i-a_{i-1}\)(默认 \(a_0\)\(0\)),则每次对 \(a_l\sim a_r\)\(d\) 的操作,只会影响 \(b_l\)\(b_{r+1}\) 的值,即 \(b_l\gets b_l+d,b_{r+1}\gets b_{r+1}-d\),查询时即求 \(\gcd (b_{l+1},b_{l+2},\cdots,b_r)\)。这一部分可用线段树维护,复杂度 \(\Omicron (n\log_2 n)\)

剩下的 \(a_l\) 怎么求?显然 \(\sum\limits_{i=1}^{l}b_i=\sum\limits_{i=1}^{l}a_i-a_{i-1}=a_l\)。我与上一部分分开用树状数组维护的,时间复杂度亦为 \(\Omicron (n\log_2 n)\)

细节及难点:没什么难点,注意我们对于修改 \(a_l\sim a_r\) 的操作实际修改了 \(b_l,b_{r+1}\),如果没判 \(r+1\le n\) 的话建树时需要建到 \(n+1\)

B

简化题意:

思路:

细节及难点:

核心代码:

C

简化题意:

思路:

细节及难点:

D

简化题意:

思路:

细节及难点:

E

简化题意:

思路:

细节及难点:

F

简化题意:

思路:

细节及难点:

G

简化题意:

思路:

细节及难点:

posted @ 2025-03-02 19:17  M_CI  阅读(19)  评论(0)    收藏  举报