# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1116922 | vux2code | Burza (COCI16_burza) | C++17 | 4 ms | 760 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Src : Vux2Code
/* Note :
*/
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
// template <typename T> void vout(T s){ cout << s << endl; exit(0);}
typedef long long ll;
typedef long double ld;
typedef pair <ll, ll> pll;
const ll maxN = 20, maxLog = 20, inf64 = 1e18, inf32 = 1e9, mod = 1e9 + 7;
void maximize (ll &x, ll y) {x = max (x, y);}
void minimize (ll &x, ll y) {x = min (x, y);}
/* ---------HASHING-------- */
// const base = 31, mod2 = 1e9 + 9;
/* ---------BITMASK-------- */
// ll count (ll x) {return __builtin_popcountll (x);}
// ll fst (ll x) {return 63 - __builtin_clzll (x);}
// ll last (ll x) {return __builtin_ctzll (x);}
// bool bit (ll x, ll y) {return ((x >> y) & 1);}
ll t = 1;
ll n;
ll k;
vector<int> tree[maxN];
vector<int> nodesAtDepth[maxN];
int discovery[maxN], finish[maxN], depth[maxN];
char dp[maxN][1 << maxLog];
int timeCounter = 0;
void dfs(int node, int parent) {
if (node != 0) depth[node] = depth[parent] + 1;
if (depth[node] == k - 1) {
discovery[node] = timeCounter++;
finish[node] = timeCounter;
return;
}
discovery[node] = timeCounter;
for (int neighbor : tree[node]) {
if (neighbor != parent) dfs(neighbor, node);
}
finish[node] = timeCounter;
}
bool canWin() {
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i < n; i++) {
nodesAtDepth[discovery[i]].push_back(i);
}
for (int time = 0; time < timeCounter; time++) {
for (int mask = 0; mask < (1 << k); mask++) {
if (!dp[time][mask]) continue;
for (int node : nodesAtDepth[time]) {
if (!(mask & (1 << depth[node]))) {
dp[finish[node]][mask | (1 << depth[node])] = 1;
}
}
}
}
for (int mask = 0; mask < (1 << k); mask++) {
if (dp[timeCounter][mask]) return true;
}
return false;
}
void readInput() {
cin >> n >> k;
if (k * k >= n) {
cout << "DA\n";
exit(0);
}
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
a--; b--;
tree[a].push_back(b);
tree[b].push_back(a);
}
}
void solve () {
// cin >> n >> k;
readInput();
depth[0] = -1;
dfs(0, -1);
cout << (canWin() ? "DA" : "NE") << "\n";
}
int main () {
ios::sync_with_stdio (0);
cin. tie (0);
cout. tie (0);
#define TASK "task"
if (fopen (TASK".inp", "r")) {
freopen (TASK".inp", "r", stdin);
freopen (TASK".out", "w", stdout);
}
// cin >> t;
while (t --) solve ();
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |