求区间的最大gcd(a,b),就是找一个数是在这个区间所有数的约数中,至少出现两次,而且最大的那个数。那么接下来就比较容易了,从右到左扫描数列,用pre[i]表示约数 i 在当前这个位置往右第一次出现的位置,那么每到一个位置枚举num[i]的所有约数,然后用树状数组维护一个区间最大值就行了,用树状数组维护区间最大值有点麻烦,但这里是从右往左扫描的,因此可以求0-i点的最大值,就很简单了。。。
1 //STATUS:C++_AC_546MS_1596KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include