Advertisement
Alex_tz307

USACO 2020 February Contest, Gold Problem 3. Delegation

Jun 1st, 2021
1,003
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("deleg.in");
  6. ofstream fout("deleg.out");
  7.  
  8. const int MAXN = 1e5 + 1;
  9. int n, paths[MAXN];
  10. vector<int> G[MAXN], sub[MAXN];
  11.  
  12. int dfs(int u, int p) {
  13.   int szu = 1;
  14.   for (int v : G[u])
  15.     if (v != p) {
  16.       int szv = dfs(v, u);
  17.       sub[u].emplace_back(szv);
  18.       szu += szv;
  19.     }
  20.   if (p)
  21.     sub[u].emplace_back(n - szu);
  22.   return szu;
  23. }
  24.  
  25. bool check(int k) {
  26.   if ((n - 1) % k)
  27.     return false;
  28.   for (int i = 1; i < k; ++i)
  29.     paths[i] = 0;
  30.   for (int u = 1; u <= n; ++u) {
  31.     int pairs = 0;
  32.     for (int x : sub[u]) {
  33.       x %= k;
  34.       if (x == 0)
  35.         continue;
  36.       if (paths[k - x])
  37.         --paths[k - x], --pairs;
  38.       else ++paths[x], ++pairs;
  39.     }
  40.     if (pairs)
  41.       return false;
  42.   }
  43.   return true;
  44. }
  45.  
  46. int main() {
  47.   fin >> n;
  48.   for (int i = 1; i < n; ++i) {
  49.     int u, v;
  50.     fin >> u >> v;
  51.     G[u].emplace_back(v);
  52.     G[v].emplace_back(u);
  53.   }
  54.   dfs(1, 0);
  55.   for (int k = 1; k < n; ++k)
  56.     fout << (check(k) ? '1' : '0');
  57.   fout << '\n';
  58.   fin.close();
  59.   fout.close();
  60.   return 0;
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement