답안 #434709

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
434709 2021-06-21T15:19:02 Z KoD Mousetrap (CEOI17_mousetrap) C++17
25 / 100
1379 ms 68984 KB
#include <bits/stdc++.h>

template <class T> using Vec = std::vector<T>;

template <class F> struct RecLambda : private F {
    explicit RecLambda(F&& f) : F(std::forward<F>(f)) {}
    template <class... Args> decltype(auto) operator() (Args&&... args) const {
        return F::operator()(*this, std::forward<Args>(args)...);
    }
};

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int N, T, M;
    std::cin >> N >> T >> M;
    T -= 1;
    M -= 1;
    Vec<Vec<int>> graph(N);
    for (int i = 0; i < N - 1; ++i) {
        int a, b;
        std::cin >> a >> b;
        a -= 1;
        b -= 1;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    Vec<int> parent(N, -1);
    RecLambda([&](auto&& dfs, const int u) -> void {
        for (const int v : graph[u]) {
            if (parent[u] != v) {
                parent[v] = u;
                dfs(v);
            }
        }
    })(T);
    Vec<int> dp(N, -1);
    Vec<char> used(N);
    const auto down = RecLambda([&](auto&& dfs, const int u) -> int {
        if (dp[u] != -1) {
            return dp[u];
        }
        Vec<int> cand;
        for (const int v : graph[u]) {
            if (v != parent[u] and !used[v]) {
                cand.push_back(dfs(v));
            }
        } 
        std::sort(cand.rbegin(), cand.rend());
        if (cand.size() <= 1) {
            return dp[u] = (int) cand.size();
        }
        return dp[u] = cand[1] + (int) cand.size();
    });
    Vec<int> cut(N);
    RecLambda([&](auto&& dfs, const int u) -> void {
        for (const int v : graph[u]) {
            if (parent[u] != v) {
                cut[v] += cut[u];
                if (u != T) {
                    cut[v] += (int) graph[u].size() - 2;
                }
                dfs(v);
            }
        }
    })(T);
    std::cout << RecLambda([&](auto&& dfs, const int u) -> int {
        if (u == T) {
            return 0;
        }
        used[u] = true;
        int dmax = 0;
        for (const int v : graph[u]) {
            if (parent[u] != v and !used[v]) {
                dmax = std::max(dmax, down(v) + cut[v] + 1);
            }
        }
        if (dmax == 0) {
            dmax = cut[u];
        }
        const int up = dfs(parent[u]);
        return std::min({dmax + 2, std::max(down(u) + cut[u], up + 1), std::max(dmax, up)});
    })(M) << '\n';
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 446 ms 67756 KB Output is correct
2 Correct 387 ms 61068 KB Output is correct
3 Correct 1322 ms 68952 KB Output is correct
4 Correct 659 ms 34500 KB Output is correct
5 Correct 1379 ms 68984 KB Output is correct
6 Correct 1321 ms 68932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -