Submission #1144067

#TimeUsernameProblemLanguageResultExecution timeMemory
1144067db_123Triumphal arch (POI13_luk)C++20
90 / 100
829 ms27808 KiB
#include <iostream>
#include <vector>
#include <functional>

using namespace std;

int n;
vector<vector<int>> graph;

void read() {
    cin >> n;
    graph.resize(n + 1);
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        graph[a].emplace_back(b);
        graph[b].emplace_back(a);
    }
}

bool check(int mid) {
    vector<int> dp(n + 1);
    
    function<void(int, int)> dfs;
    dfs = [&mid, &dp, &dfs](int node, int par) -> void {
        int cnt = 0;
        for (auto it : graph[node]) {
            if (it == par) {
                continue;
            }
            cnt ++;
            dfs(it, node);
        }
        for (auto it : graph[node]) {
            if (it == par) {
                continue;
            }
            dp[node] += dp[it];
        }
        dp[node] -= mid - cnt;
        dp[node] = max(dp[node], 0);
    };
    dfs(1, 0);
    return dp[1] == 0;
}

void solve() {
    int l = 1, r = n, mid, rsBs = -1;

    while (l <= r) {
        mid = l + (r - l) / 2;
        if (check(mid)) {
            rsBs = mid;
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    cout << rsBs;
}

int main() {

    read();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...