1.题目描述:点击打开链接
2.解题思路:本题利用莫队算法解决。由于是第一次学习这个算法,因此研究了比较长的一段时间才弄懂。首先,莫队算法解决的问题是无修改的离线区间查询问题。该算法实际上是由曼哈顿距离最小生成树演变来的,由于要处理m个区间,可以将这m个区间看做二维平面上的点,那么处理这m个区间就等价于让这m点连通,且总的转移代价最小。这其实就是一个曼哈顿距离最小生成树问题。
经典的曼哈顿距离最小生成树的时间复杂度是O(NlogN),莫队算法的时间复杂度是O(N^1.5)。不过本题还有一个地方,就是区间怎么处理。因为GCD相同的区间是可以合并的,因此不同的区间个数实际上是log级别的,一共有左右N个区间要处理,复杂度是O(NlogN)。下面用一个简单的例子来说明一下区间合并。
比如,数组是2,3,3,6,8,16,下标从1开始,下面的[i,j]->g表示a[i]到a[j]所有数到左端点的区间的GCD都是g。
a[1]=2: [1,1]->2, [2,6]->1
a[2]=3: [2,4]->3, [5,6]->1
a[3]=3: [3,4]->3, [5,6]->1
a[4]=6: [4,4]->4, [5,6]->2
a[5]=8: [5,6]->8
a[6]=16: [6,6]->16
从上面的例子中可以发现,以i为左端点构成的所有GCD值不等的区间实际上非常少。
处理完区间&#