AcWing 1075. 数字转换
原题链接
中等
作者:
季之秋
,
2021-04-15 14:39:44
,
所有人可见
,
阅读 273
import java.util.*;
public class Main{
static int N = 50010 * 2, res = 0;
static int e[] = new int[N], ne[] = new int[N], h[] = new int[N], idx;
static int sum[] = new int[N];
static void add(int a, int b){
e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
static int dfs(int u, int fa){
int d1 = 0, d2 = 0;
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if(j == fa) continue;
int d = dfs(j, u) + 1;
if(d >= d1){
d2 = d1; d1 = d;
}else if(d > d2) d2 = d;
}
res = Math.max(res, d1 + d2);
return d1;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Arrays.fill(h, -1);
for(int i = 1; i <= n; i ++){
for(int j = 2; j <= n /i ; j ++){
sum[i*j] += i; // 对于任一约数都会被枚举到,
}
}
boolean st[] = new boolean[N];
for(int i = 2; i <= n; i ++){ // sum[1] = 0 是没有枚举的
if(i > sum[i]){
add(sum[i], i); add(i, sum[i]);
st[i] = true; // 标记每个子节点
}
}
for(int i = 1; i <= n; i ++){
if(!st[i]) dfs(i, -1); // 每个没被标记的都代表一颗单独的树,dfs会遍历这个树每个点的最大距离
}
System.out.println(res);
}
}