Submission #1231618

#TimeUsernameProblemLanguageResultExecution timeMemory
1231618bbldrizzyBurza (COCI16_burza)C++20
160 / 160
239 ms2496 KiB
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
int n, k; 
vector<vector<int>> adj;
vector<int> l;
vector<int> r;
vector<int> dp;
vector<int> depth;
int cur = 0;

void dfs(int nd, int pr) {
    if (depth[nd] == k) {
        l[nd] = r[nd] = ++cur;
        return;
    }
    for (int x: adj[nd]) {
        if (x == pr) continue;
        depth[x] = depth[nd]+1;
        dfs(x, nd);
        l[nd] = min(l[nd], l[x]);
        r[nd] = max(r[nd], r[x]);
    }
}

int main() {
    cin >> n >> k;
    if (k*k >= n) {
        cout << "DA"; exit(0);
    }
    adj.resize(n);
    l.resize(n, 1e9);
    r.resize(n);
    depth.resize(n);
    dp.resize(1<<19);
    for (int i = 0; i < n-1; i++) {
        int a, b; cin >> a >> b; --a; --b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    dfs(0, -1);
    for (int i = 1; i < (1<<k); i++) {
        for (int j = 1; j < n; j++) {
            if (!(i&(1<<(depth[j]-1)))) continue;
            if (dp[i^(1<<(depth[j]-1))]+1 >= l[j]) dp[i] = max({dp[i], dp[i^(1<<(depth[j]-1))], r[j]});
        }
    }
    cout << (dp[(1<<k)-1] == cur ? "DA" : "NE");
} 
#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...