Advertisement
Kevin_Zhang

Untitled

Apr 24th, 2020
580
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb emplace_back
  3. using namespace std;
  4. using ll = long long;
  5. const int maxn = 40001;
  6. const int bs = maxn;
  7. //const int bs = 10;
  8. int n, k;
  9. vector<int> edge[maxn];
  10. bitset<bs> dp[2][maxn];
  11. int sz[maxn];
  12. void add(int& a, int v) {
  13.     a += v-k;
  14.     a += (a>>31)&k;
  15. }
  16. void gs(int now, int last = 0) {
  17.     sz[now] = 1;
  18.     if (auto it = find(edge[now].begin(), edge[now].end(), last); it != edge[now].end()) {
  19.         swap(*it, edge[now].back());
  20.         edge[now].pop_back();
  21.     }
  22.     for (int u : edge[now])
  23.         gs(u, now), add(sz[now], sz[u]);
  24. }
  25. bool ans[maxn];
  26. void dfs(int now) {
  27.     static int d;
  28.     add(d, 1);
  29. #define cd d
  30.     //int cd = d;
  31.     ans[now] = (!cd || (((dp[0][now] << cd) | (dp[0][now] >> (k-cd))) & (dp[1][now])).any());
  32.     //ans[now] = (dp[0][now] & dp[1][now])[ k - cd ];
  33.     auto &e = edge[now];
  34.     if (e.size()) {
  35. #define GL(u) (sz[u] ? dp[0][u] | (dp[0][u] << sz[u]) | (dp[0][u] >> (k-sz[u])) : dp[0][u])
  36. #define GR(u) (sz[u] ? dp[1][u] | (dp[1][u] >> sz[u]) | (dp[1][u] << (k-sz[u])) : dp[1][u]);
  37.         dp[0][ e[0] ] = dp[0][now];
  38.         dp[1][ e.back()] = dp[1][now];
  39.         for (int i = 0;i+1 < e.size();++i)
  40.             dp[0][e[i+1]] = GL(e[i]);
  41.         for (int i = e.size()-1;i > 0;--i)
  42.             dp[1][e[i-1]] = GR(e[i]);
  43.  
  44.         for (int u : edge[now])
  45.             dfs(u);
  46.     }
  47.     --d;
  48.     d += (d>>31)&k;
  49. }
  50. signed main(){
  51.     ios_base::sync_with_stdio(0), cin.tie(0);
  52.     cin >> n >> k;
  53.     for (int i = 1, a, b;i < n;++i) {
  54.         cin >> a >> b;
  55.         edge[a].pb(b);
  56.         edge[b].pb(a);
  57.     }
  58.     dp[0][1][k] = dp[0][1][0] = dp[1][1][0] = dp[1][1][k] = true;
  59.     gs(1);
  60.     dfs(1);
  61.     for (int i = 1;i <= n;++i)
  62.         cout << (ans[i]?'Y':'N');
  63.     cout << '\n';
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement