제출 #1214167

#제출 시각아이디문제언어결과실행 시간메모리
1214167ericl23302Burza (COCI16_burza)C++20
160 / 160
30 ms840 KiB
#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, k; cin >> n >> k;
    if (k * k >= n) {
        cout << "DA\n";
        return 0;
    }

    vector<vector<int>> adjacency(n);
    for (int i = 0; i < n - 1; ++i) {
        int a, b; cin >> a >> b; --a; --b;
        adjacency[a].push_back(b);
        adjacency[b].push_back(a);
    }

    map<int, int> leafIndex;
    vector<vector<int>> nodeAtDepths(k + 1);
    vector<pair<int, int>> intervals(n, {n, -1});

    function<void(int, int, int)> processTree;
    processTree = [&](int cur, int prev, int depth) {
        nodeAtDepths[depth].push_back(cur);
        if (depth == k) {
            leafIndex[cur] = leafIndex.size();
            intervals[cur] = {leafIndex[cur], leafIndex[cur]};
            return;
        }
        for (int &node : adjacency[cur]) {
            if (node == prev) continue;
            processTree(node, cur, depth + 1);
            intervals[cur].first = min(intervals[cur].first, intervals[node].first);
            intervals[cur].second = max(intervals[cur].second, intervals[node].second);
        }
    };

    processTree(0, -1, 0);

    vector<int> dp(1 << k, -1);
    for (int i = 0; i < (1 << k); ++i) {
        for (int j = 0; j < k; ++j) {
            if (!(i & (1 << j))) continue;
            int prev = dp[i ^ (1 << j)];
            for (int &node : nodeAtDepths[j + 1]) {
                if (intervals[node].first <= prev + 1) dp[i] = max(dp[i], intervals[node].second);
            }
        }

        if (dp[i] == leafIndex.size() - 1) {
            cout << "DA\n";
            return 0;
        }
    }

    cout << "NE\n";
    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...