Codeforces 264B. Good Sequences

frog&7發表於2020-11-05

題意:稱遞增的且相鄰數不互質的數列為好數列,給出一個數列,求出最長的好數列子列長度
例如 [2 4 6 9] [2 6 10 15 21] …etc
思路:建立一個二維陣列,維護每個數的因子和它自己,然後遍歷數列中每個數字,並且更新每個因子目前的最長值,每步都更新一次最大值作為答案

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
vector<int> s[maxn+5];
int k=1;
void solve()
{

    for(int i=2;i<=maxn;i++)
    {
        if(!s[i].size())
        {
            for(int j=i;j<=maxn;j+=i)s[j].push_back(i);
        }
    }
}
int a[maxn];
int dp[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    solve();
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++){
            int ii=a[i];
            int cur=1;
        for(int j=0;j<s[ii].size();j++){
            cur=max(cur,dp[s[ii][j]]+1);
        }
        ans=max(ans,cur);
        for(int j=0;j<s[ii].size();j++){
            dp[s[ii][j]]=max(dp[s[ii][j]],cur);
        }
    }
    cout<<ans<<endl;
}

相關文章