답안 #243145

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
243145 2020-06-30T12:30:42 Z kartel Burza (COCI16_burza) C++14
0 / 160
86 ms 4728 KB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define in(x) freopen(x, "r", stdin)
#define out(x) freopen(x, "w", stdout)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#define F first
#define S second
#define pb push_back
#define N +4005
#define M ll(1e9 + 7)
#define sz(x) (int)x.size()
#define re return
#define oo ll(1e9)
#define el '\n'
#define pii pair <int, int>
#define err ld(1e-9)
#define last(x) x.back()
#define all(x) (x).begin(), (x).end()
#define arr_all(x, n) (x + 1), (x + 1 + n)
using namespace std;
//using namespace __gnu_pbds;
//typedef tree <int, null_type, less_equal <int> , rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef long long ll;
typedef long double ld;

int dp[N], i, mask, tin[N], tout[N], tim, v, u, k, n;
vector <int> g[N], vr[N];

void print(string ans)
{
    cout << ans;
    exit(0);
}

void dfs(int v, int pr)
{
    if (dp[v] == k)
    {
        tin[v] = tim++;
        tout[v] = tim;
        return;
    }

    tin[v] = tim;

    for (auto u : g[v])
    {
        if (u == pr) continue;

        dp[u] = dp[v] + 1;
        dfs(u, v);
    }

    tout[v] = tim;
}

bool calc()
{
    char f[tim + 5][1 << (k + 1)];

    f[0][0] = 1;

    for (i = 1; i <= n; i++)
        vr[tin[i]].pb(i);

    for (i = 0; i < tim; i++)
    {
        for (mask = 0; mask < (1 << k); mask++)
        {
            if (!f[i][mask])
                continue;

            for (auto v : vr[i])
            {

                if (!(mask & (1 << dp[v])))
                    f[tout[v]][mask | (1 << dp[v])] = 1;
            }
        }
    }

    int can = 0;

    for (mask = 0; mask < (1 << k); mask++)
        can |= f[tim][mask];

    return can;
}

int main()
{
    srand(time(0));
    ios_base::sync_with_stdio(0);
    iostream::sync_with_stdio(0);
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    //in("input.txt");
    //out("output.txt");

    cin >> n >> k;

    if (k * k >= n)
        print("DA");

    for (i = 1; i < n; i++)
    {
        cin >> u >> v;

        g[v].pb(u);
        g[u].pb(v);
    }

    dp[1] = 0;
    dfs(1, -1);

    print(calc() ? "DA" : "NE");
}

//
//00000
//00110
//00111
//00011
//00000
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 1024 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 86 ms 4088 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 70 ms 4472 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 21 ms 1664 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 62 ms 3832 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 63 ms 4004 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 80 ms 4728 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 21 ms 1664 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 1024 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 33 ms 2296 KB Output isn't correct
2 Halted 0 ms 0 KB -