8.14总结

· · 个人记录

线段树的数组要开4倍!!!!!!!!!!!

T1

题目大意:

若干次询问,每次询问给定一个区间,计算所有不是区间里所有数的gcd个数。

原思路:

直接打暴力。

正解:

维护两个数组,一个是gcd,另一个是这个gcd在区间里的个数。
注意:在建树时,两个gcd可能不相等,所以c不能直接更新,若当前区间的gcd和左区间的gcd相等,就把左区间的个数加到当前节点的个数里,若与右区间的gcd相等,就累加右区间的个数。

T2

题目大意:

工厂每天能生产b枚顶针,正常为a枚,计划选连续 k 天维修,期间停产,修复后恢复a。
有若干次操作,每种操作分两种:
1.第d_i个数增加a_i
2.询问从p_i开始的k长区间,前面的。

原思路:

直接打暴力。

正解:

维护三个数组,一个是单天的订单数,一个是如果正常的能做的订单数,一个是如果机器坏掉能做的订单数。
注意:因为一个区间有两种情况,所以可以在add里加一个标记代表机器有没有维修好,也可以写两个修改函数。

T3

题目大意:

有若干次操作,每种操作分两种:
1.把b数组从y开始的连续k个数改为a数组从x开始的连续k个数。
2.询问b_x

原思路:

直接打暴力。

正解:

只需维护一个懒标记数组,记录更改的开头。
注意:懒标记记录的数需要更改,可以在往左区间和右区间递归时

T4

题目大意:

有若干次操作,每种操作分三种:
1.询问区间总和。
2.将区间内所有数%m。
3.将a_k改为x。

原思路:

原本写了个线段树,知道要遍历到单节点,但不知道怎么优化。

正解:

很像花神那道题,一个区间不能整体操作,所以必须递归到子节点,可以发现,当一个数小于模数的时侯,就还是那个数,那么当一个区间内最大值小于m,就不考虑继续递归。
所以,只需维护两个数组,一个代表区间总和,另一个代表区间最大值,其余没什么要特殊注意的了。