HDU4630 No Pain No Game

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])這個可以使用線段樹維護

接下來依次更新~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章