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;
- }
- inline char readchar(){static const size_t bufsize = 1 << 16; static size_t p = 0, end = 0; static char buf[bufsize]; if (p == end) end = fread_unlocked(buf, sizeof(char), bufsize, stdin), p = 0; return p == end ? EOF : buf[p++]; }
- inline void read(char &a){while(isspace(a = readchar()));}
- inline void read(char *a){while(isspace(*a = readchar()));++a; while(isgraph(*a = readchar()))++a;}
- inline void read(string &a){static char p; while(isspace(p = readchar())); a = p; while(isgraph(p = readchar()))a.push_back(p);}
- template<typename T> inline void read(T& a){static char p; static bool b;while (!isdigit(p = readchar()))b = p == '-'; a = p ^ '0'; while (isdigit(p = readchar())) a *= 10, a += p ^ '0'; if(b)a *= -1, b = false; }
- template<typename T1, typename T2> inline void read(pair<T1, T2> &a){read(a.first), read(a.second);}
- template<typename T> inline void read(T begin, const T &end){while(begin != end)read(*begin), ++begin;}
- inline void R(){} template<class T1, class... T2> inline void R(T1 &h, T2 &... e){read(h), R(e...);}
- signed main(){
- ios_base::sync_with_stdio(0), cin.tie(0);
- R(n, k);
- //cin >> n >> k;
- for (int i = 1, a, b;i < n;++i) {
- R(a, b);
- //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)
- putchar(ans[i]?'Y':'N');
- putchar('\n');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement