Submission #716755

#TimeUsernameProblemLanguageResultExecution timeMemory
716755nononoBurza (COCI16_burza)C++14
160 / 160
200 ms206668 KiB
#include "bits/stdc++.h"
#define SZ(x) (int)(x.size())
using namespace std;

const int mxN = 400 + 2;

int n, k, h[mxN], mark[mxN];
int l[mxN], r[mxN], cnt;
int link[mxN][20], dp[1 << 18][mxN];

vector<vector<int>> adj(mxN);

int dfs(int u, int par){
    if(h[u] > k) mark[u] = 1;
    
    int maxH = h[u];
    for(int v : adj[u]){
        if(v == par) continue ;
        
        h[v] = h[u] + 1;
        maxH = max(maxH, dfs(v, u));
    }
    
    if(maxH < k) mark[u] = 1;
    return maxH;
}

void dfs2(int u, int par){
    
    for(int v : adj[u]){
        if(v == par) continue ;
        h[v] = h[u] + 1;
        dfs2(v, u);
        
        if(l[u] == 0) l[u] = l[v];
        r[u] = r[v];
    }
    
    if(h[u] == k){
        cnt ++ ;
        l[u] = cnt;
        r[u] = cnt;
    }
    
    int depth = k - h[u];
    for(int i = l[u]; i <= r[u]; i ++)
        link[i][depth] = r[u];
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    cin >> n >> k;
    
    vector<pair<int, int>> edges;
    
    for(int i = 1; i <= n - 1; i ++){
        int u, v;
        cin >> u >> v;
        
        adj[u].push_back(v);
        adj[v].push_back(u);
        
        edges.push_back({u, v});
    }
    
    dfs(1, 0);
    vector<int> a;
    
    for(int i = 1; i <= n; i ++){
        if(mark[i] == 0) a.push_back(i);
        
        h[i] = 0;
        adj[i].clear();
    }
    
    for(auto [u, v] : edges){
        if(mark[u] == 0 && mark[v] == 0){
            int x = upper_bound(a.begin(), a.end(), u) - a.begin();
            int y = upper_bound(a.begin(), a.end(), v) - a.begin();
            
            adj[x].push_back(y);
            adj[y].push_back(x);
        }
    }
    
    n = a.size();
    
    if(k * k >= n){
        cout << "DA\n";
        exit(0);
    }
    
    dfs2(1, 0);
    
    dp[0][1] = 1;
    for(int i = 1; i <= cnt; i ++){
        for(int mask = 0; mask < (1 << k); mask ++){
            if(dp[mask][i] == 0) continue ;
            
            for(int x = ((1 << k) - 1) ^ mask; x > 0; x ^= x & (- x)){
                int j = __builtin_ctz(x & (- x));
                dp[mask | (1 << j)][link[i][j] + 1] = 1;
            }
        }
    }
    
    if(dp[(1 << k) - 1][cnt + 1] == 1) cout << "DA\n"; else cout << "NE\n";
    return 0;
}

Compilation message (stderr)

burza.cpp: In function 'int main()':
burza.cpp:77:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   77 |     for(auto [u, v] : edges){
      |              ^
#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...