OO’s Sequence
阿新 • • 發佈:2019-05-02
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