sample:
1
10
8 2 4 9 5 7 10 6 1 3
5
2 10
2 4
6 9
1 4
7 10
意思是:
1表示測試樣例有一個
10表示接下來一行有10個數,編號爲1-10
5表示接下來的5次詢問
每次詢問有兩個數L R,詢問[L,R]區間任意兩個數的最大公約數的最大值
解法:
2013多校第三場的題,官方的題解我這渣渣是看不懂了,以下整理總體思路
首先,做法是離線
將5次詢問按照右端點排序,排序後的結果爲
1 4
2 4
6 9
2 10
7 10
對於區間[L,R]的結果,也就是區間內一個數的一個約數等於區間內另一個數的一個約數,
這個約數就是一個可行答案,求一個最大的可行答案
對於10個數的第一個數8,約數爲1,2,4,8,也就是說,
凡是滿足L<=1,R>=1的區間再出現一次這4個約數中的任何一個,就有一個可行答案
維護一個pre數組,pre[i]的含義爲i這個約數上一次出現的原因是10個數中的第幾個數
維護一個a數組,a[i]的含義爲左端點小於等於i的區間最大可行答案(這個定義不太嚴謹)
以下模擬整個過程,初始設定pre爲-1,a爲-1
第一個數8,更新pre[1]=1;pre[2]=1;pre[4]=1;pre[8]=1;
第二個數2,更新pre[1]時,由於pre[1]已被初始化,也就是說1這個約數出現了兩次,
上次出現的位置是1,這次是2,
也就是說滿足L<=1,R>=2的區間均有一個可行答案1,由於處理到第二個數時,
已經把R<2的區間全部處理出結果了(這是按照右端點排序的原因)。
所以,對於剩下沒有出結果的區間,只要滿足L<=1就有可行答案1,
只需維護a數組就可以繼續往下處理,此時顯然
更新a[1]=1;此時的pre數組爲pre[1]=2;pre[2]=2;pre[4]=1;pre[8]=1;
此處更新pre[1]=2;pre[2]=2;的原因是之後的區間只要L<=2就可以滿足條件,
相比L<=1範圍更大了
對於[L,R],答案就是max(a[L]...a[R])這個可以使用線段樹維護
接下來依次更新~