Submission #666254

#TimeUsernameProblemLanguageResultExecution timeMemory
666254finn__Burza (COCI16_burza)C++17
0 / 160
1 ms348 KiB
#include <bits/stdc++.h>
using namespace std;

size_t n, k;
vector<set<unsigned>> g;
vector<unsigned> subtree_height;
vector<vector<unsigned>> dp;

void calc_subtree_height(unsigned u, unsigned p = -1, unsigned h = 0)
{
    bool is_leaf = 1;

    for (unsigned v : g[u])
    {
        if (v != p)
        {
            calc_subtree_height(v, u, h + 1);
            is_leaf = 0;
            subtree_height[u] = max(subtree_height[u], subtree_height[v]);
        }
    }

    if (is_leaf)
        subtree_height[u] = h;
}

void calc_dp(unsigned u, unsigned p = -1, unsigned h = 0)
{
    if (h > k)
    {
        dp[u][0] = 1;
        return;
    }

    vector<unsigned> ch;

    for (unsigned v : g[u])
    {
        if (v != p)
        {
            calc_dp(v, u, h + 1);
            ch.push_back(v);
        }
    }

    size_t const m = ch.size();

    dp[u][0] = 1;

    if (k >= m + h)
        for (unsigned j = 1; j <= k - m - h + 1; j++)
        {
            // j is the number of steps S is ahead. j = 1 means the coin is
            // at u and D can now mark a node.

            vector<unsigned> dp2(1 << m, UINT_MAX);
            for (unsigned i = 0; i < m; i++)
                dp2[1 << i] = dp[ch[i]][j - 1];

            for (unsigned z = 1; z < 1 << m; z++)
            {
                for (unsigned i = 0; i < m; i++)
                {
                    if (z & (1 << i) && dp2[z ^ (1 << i)] != UINT_MAX)
                        dp2[z] = min(dp2[z], dp2[z ^ (1 << i)] + dp[ch[i]][dp2[z ^ (1 << i)]]);
                }
            }

            dp[u][j] = dp2[(1 << m) - 1];
        }
}

int main()
{
    cin >> n >> k;

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

    g = vector<set<unsigned>>(n);
    for (size_t i = 0; i < n - 1; i++)
    {
        unsigned u, v;
        cin >> u >> v;
        g[u - 1].insert(v - 1);
        g[v - 1].insert(u - 1);
    }

    subtree_height = vector<unsigned>(n, 0);
    calc_subtree_height(0);

    bool impossible = 0;
    for (unsigned u = 0; u < n; u++)
    {
        unsigned num_greater_k = 0;
        for (unsigned v : g[u])
        {
            if (subtree_height[v] > k)
                num_greater_k++;
        }
        if (num_greater_k > k)
        {
            impossible = 1;
            break;
        }
    }

    if (impossible)
    {
        cout << "NE\n";
        return 0;
    }

    for (unsigned u = 0; u < n; u++)
    {
        if (subtree_height[u] <= k)
            while (!g[u].empty())
            {
                g[*g[u].begin()].erase(u);
                g[u].erase(g[u].begin());
            }
    }

    dp = vector<vector<unsigned>>(n, vector<unsigned>(k + 1, UINT_MAX));
    calc_dp(0);

    cout << (dp[0][1] == UINT_MAX ? "NE\n" : "DA\n");
}

Compilation message (stderr)

burza.cpp: In function 'void calc_dp(unsigned int, unsigned int, unsigned int)':
burza.cpp:60:36: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
   60 |             for (unsigned z = 1; z < 1 << m; z++)
      |                                  ~~^~~~~~~~
#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...