ST表-2
维护GCD
给出一个长度为n(1<=n<=10^5 )的序列和q(1<=q<=3*10^5)个询问,每个询问输出一行,询问gcd(a_i,a_i+1,...,a_j)=x的(i,j)的对数。
思考:首先GCD是可以重叠的符合ST表,其次思考f[l][len]如何转移,通过之前的学习可知f[l][len]依旧可以拆成f[l][len-1]和f[l+(1<<(len-1))][len-1]只不过改成gcd,查询同理
接下来的问题在于询问中给定的是x
那么我们需要提前预处理一下
可以发现对于每个以i为开头,它的gcd一定会越来越小,采用二分解决
朋友与序列
给定序列 a 和序列 b,长度均为 n。问有多少组 (l,r),满足 1<=l<=r<=n且max(a_l,a_l+1,...,a_r) = min(b_l,b_l+1,...,b_r)
因为是取max,min,与重叠所以这一部分可以使用ST表,接下来枚举右端点的同时二分左端点(这里要二分两个一个大于,一个大于等于)
[CSP-S 2022] 策略游戏
分情况讨论,发现,最后的答案只会关乎到最大的,非负数中最小的,最小的,非正数里最大的
同时再取非负数的时候可以先将负数置为正无穷,同理再取非正数的时候可以先将正数置为负无穷
这样建立四个ST表即可(封装一下)
最后的答案为任意a,b两个相乘的最小值