Submission #1305387

#TimeUsernameProblemLanguageResultExecution timeMemory
1305387LucasLeHard route (IZhO17_road)C++20
52 / 100
2099 ms63808 KiB
#include <bits/stdc++.h>

const int maxn = 5e5 + 5;

long long mx_len, ways;
int N;
bool is_leaf[maxn + 5];
std::vector<int> G[maxn + 5];
std::pair<std::pair<int, int>, std::pair<int, int>> f[maxn + 5];

void preDFS(int u, int p) {
    if (G[u].size() == 1) {
        is_leaf[u] = true;
    }
    for (int v : G[u]) {
        if (v == p) continue;
        preDFS(v, u);
    }
}

void DFS(int u, int p, int depth) {
    std::pair<int, int> &pf = f[u].first, &ps = f[u].second;
    if (p && G[u].size() == 1) {
        pf = {0, 1};
        ps = {0, 0};
        return;
    }
    
    pf = {0, 0}, ps = {0, 0};
    int x, y, cnt = 0;

    for (int v : G[u]) {
        if (v == p) continue;
        DFS(v, u, depth + 1);

        std::tie(x, y) = f[v].first;
        x++;

        if (x > pf.first) {
            cnt = 1;
            ps = pf;
            pf = {x, y};
        } else if (x == pf.first) {
            cnt++;
            pf.second += y;
        } else if (x > ps.first) {
            ps = {x, y};
        } else if (x == ps.first) {
            ps.second += y;
        }
    }
    
    if (cnt > 1) {
        y = pf.first;
        long long len = 1ll * (depth + y) * y;
        if (len > mx_len) {
            mx_len = len;
            ways = pf.second;
        } else if (len == mx_len) {
            ways += pf.second;
        }
    } else if (ps.second) {
        x = ps.first;
        y = pf.first;
        long long len = 1ll * (depth + x) * y;
        if (len > mx_len) {
            mx_len = len;
            ways = ps.second;
        } else if (len == mx_len) {
            ways += ps.second;
        }
    }
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);

    std::cin >> N;
    for (int i = 1; i < N; ++i) {
        int u, v; std::cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    preDFS(1, 0);
    for (int u = 1; u <= N; ++u) if (is_leaf[u]) {
        DFS(u, 0, 0);
    }

    if (!mx_len) {
        std::cout << 0 << ' ' << 1 << '\n';
    } else {
        std::cout << mx_len << ' ' << ways / 2 << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...