Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pb emplace_back
- using namespace std;
- using ll = long long;
- const int maxn = 40001;
- const int bs = maxn;
- //const int bs = 10;
- int n, k;
- vector<int> edge[maxn];
- bitset<bs> dp[2][maxn];
- int sz[maxn];
- void add(int& a, int v) {
- a += v-k;
- a += (a>>31)&k;
- }
- void gs(int now, int last = 0) {
- sz[now] = 1;
- if (auto it = find(edge[now].begin(), edge[now].end(), last); it != edge[now].end()) {
- swap(*it, edge[now].back());
- edge[now].pop_back();
- }
- for (int u : edge[now])
- gs(u, now), add(sz[now], sz[u]);
- }
- bool ans[maxn];
- void dfs(int now) {
- static int d;
- add(d, 1);
- #define cd d
- //int cd = d;
- ans[now] = (!cd || (((dp[0][now] << cd) | (dp[0][now] >> (k-cd))) & (dp[1][now])).any());
- //ans[now] = (dp[0][now] & dp[1][now])[ k - cd ];
- auto &e = edge[now];
- if (e.size()) {
- #define GL(u) (sz[u] ? dp[0][u] | (dp[0][u] << sz[u]) | (dp[0][u] >> (k-sz[u])) : dp[0][u])
- #define GR(u) (sz[u] ? dp[1][u] | (dp[1][u] >> sz[u]) | (dp[1][u] << (k-sz[u])) : dp[1][u]);
- dp[0][ e[0] ] = dp[0][now];
- dp[1][ e.back()] = dp[1][now];
- for (int i = 0;i+1 < e.size();++i)
- dp[0][e[i+1]] = GL(e[i]);
- for (int i = e.size()-1;i > 0;--i)
- dp[1][e[i-1]] = GR(e[i]);
- for (int u : edge[now])
- dfs(u);
- }
- --d;
- d += (d>>31)&k;
- }
- signed main(){
- ios_base::sync_with_stdio(0), cin.tie(0);
- cin >> n >> k;
- for (int i = 1, a, b;i < n;++i) {
- cin >> a >> b;
- edge[a].pb(b);
- edge[b].pb(a);
- }
- dp[0][1][k] = dp[0][1][0] = dp[1][1][0] = dp[1][1][k] = true;
- gs(1);
- dfs(1);
- for (int i = 1;i <= n;++i)
- cout << (ans[i]?'Y':'N');
- cout << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement