1 条题解

  • 0
    @ 2025-10-8 16:58:40
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 50010;
    vector<int> G[N];
    int d1[N], d2[N], ans, sum[N];
    // d1[i]表示以i为出发点向下最长路径 
    // d2[i]表示以i为出发点向下第二长路径 
    void dfs(int x, int fa) {
        d1[x] = d2[x] = 1;
        for (int y : G[x]) if (y != fa) {
            dfs(y, x);
            if (d1[y] + 1 > d1[x]) d2[x] = d1[x], d1[x] = d1[y] + 1;
            else if (d1[y] + 1 > d2[x]) d2[x] = d1[y] + 1;
        }
        ans = max(ans, d1[x] + d2[x] - 1);
    }
    int main() {
        int n; scanf("%d", &n);
        memset(sum, 0, sizeof(sum));
        for (int i = 2, j; i <= n; i++) {
            sum[i] = 1;
            for (j = 2; j * j < i; j++) if (i % j == 0) sum[i] += j + i / j;
            if (j * j == i) sum[i] += j; 
        }
        for (int i = 1; i <= n; i++) if (sum[i] < i) G[sum[i]].push_back(i), G[i].push_back(sum[i]);
        memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); 
        ans = 0; dfs(1, -1);
        printf("%d\n", ans - 1);
        return 0;
    }
    
    • 1

    *【树形DP:树的直径】数字转换

    信息

    ID
    1798
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    30
    已通过
    14
    上传者