Codeforces 566F Clique in the Divisibility Graph

时间:2023-03-09 05:22:08
Codeforces 566F Clique in the Divisibility Graph

http://codeforces.com/problemset/problem/566/F

题目大意

有n个点,点上有值a[i], 任意两点(i, j)有无向边相连当且仅当

(a[i] mod a[j])==0||(a[j] mod a[i])==0

问这幅图中的最大连通子图是多少。

思路:直接转移,时间复杂度O(n^1.5)

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
int n,a[],f[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int main(){
n=read();int mx=;
for (int i=;i<=n;i++){
a[i]=read();
mx=std::max(mx,a[i]);
}
std::sort(a+,a++n);
int ans=;
for (int i=;i<=n;i++){
f[a[i]]++;
for (int j=a[i]+a[i];j<=mx;j+=a[i])
f[j]=std::max(f[j],f[a[i]]);
ans=std::max(ans,f[a[i]]);
}
printf("%d\n",ans);
}