1. 程式人生 > >OO’s Sequence

OO’s Sequence

tor size ide seq ++ != 遍歷 區間 pla

題目數據範圍$n\le 10^5$,$O(n^2)$的暴力必定超時。但是,$0<a[i] \le 10000$,可以先求出1~10000每個數的因子(vector)。

接下來,運用一個思想:

前不見古人,後不見來者。

即:對於每個位置i,找到左邊最近的“古人”j,記為l[i],滿足a[j]是a[i]的因子;找到右邊最近的“來者”k,記為r[i],滿足a[k]是a[i]的因子,就有$(i-j)\cdot (k-i)$個區間的f值可以加一。

為了$O(n\sqrt{\max(a[i])})$的實現,需要一個pos數組,記錄每個數字最近的出現位置。對於每個位置i,遍歷a[i]的因子,尋找最接近i的因子出現的位置(左側找最大,右側找最小)。pos用之前要初始化(左側設為0,算時先將l[i]設為0;右側設為$\le n+1$的值,算時先將r[i]設為n+1),保證因子在左側/右側。

註意:vector有兩種等價的遍歷方法,不可以混(以下摘自李煜東《算法競賽進階指南》)。

定義:

vector<int> a;

第一種:

技術分享圖片
for(int i=0;i<a.size();i++)
    cout<<a[i]<<endl;
下標

第二種:

技術分享圖片
for(vector<int>::itetator it=a.begin();it!=a.end();it++)
    cout<<*it<<endl;
叠代器

OO’s Sequence