题目大意,给定一个5万个数字的排列,然后给定5万个区间查询,其中要求在a,b中选出两个不同的数字使得gcd(a,b)达到最大。
这道题目对于我来说还是很新颖的,之前对于线段树的训练非常有限,所以对于这道题目没有很好的方法,觉得正解是这么的神奇。不说废话了。
方法:对于5万的查询,肯定是要去离线处理的,先把所有的查询按照r的大小排序,从左端开始处理这个序列,将每一个数字更新进去,怎么处理出结果呢,用一个数组prex记录含有这个数字的倍数的最优端的位置,为什么要这么记录,因为,一旦这个区间内有超过1个数字是这个数字的倍数,那么这个就是可能的解,然后我们记录一个ans数组,同时用线段树来维护,ans数组记录的内容是这个位置上的数字和右端现在处理到的区间内能够产生的最大值,然后每个添加进一个数字之后,我们就对于这个数字的所有约数进行更新,采用的线段树的单点更新,处理每一个询问采用的是区间最值得查询,代码并不是特别难写。
这个思想对于我这种接触这类的题目不多的来说确实是非常的先进,在一类题目上可以得到广泛的推广。