Submission #559276

# Submission time Handle Problem Language Result Execution time Memory
559276 2022-05-09T14:55:13 Z Sweezy Cat in a tree (BOI17_catinatree) C++17
11 / 100
1000 ms 11600 KB
#include <bits/stdc++.h>
 
using namespace std;
// #define int long long

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

#define all(a) (a).begin(), (a).end()
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define reps(i, s, n) for (int i = s; i < (n); ++i)
#define pb push_back
#define sz(a) (int) (a.size())

const int N = 2e5 + 5;
const int inf = 1e9;

vector<int> g[N];
pair<int, int> vs[N];
vector<pair<int, int>> centroids[N];
int s[N], mdist[N], used[N], res, d, m;

void sizes(int v, int p) {
  s[v] = 1;
  for (auto &u : g[v]) {
    if (u != p && !used[u]) {
      sizes(u, v);
      s[v] += s[u];
    }
  }
}

int centroid(int v, int p, int n) {
  for (auto &u : g[v]) {
    if (u != p && !used[u] && s[u] > n / 2) {
      return centroid(u, v, n);
    } 
  }
  return v;
}

void add_centroid(int v, int p, int centroid, int dist) {
  centroids[v].emplace_back(centroid, dist);
  for (auto &u : g[v]) {
    if (u != p && !used[u]) {
      add_centroid(u, v, centroid, dist + 1);
    }
  }
}

void decomposition1(int v) {
  used[v] = 1;
  sizes(v, -1);

  add_centroid(v, -1, v, 0);

  for (auto &u : g[v]) {
    if (!used[u]) {
      decomposition1(centroid(u, v, s[u]));
    }
  }
}

void dfs(int v, int p, int dst) {
  vs[m++] = {dst, v};
  for (auto &u : g[v]) {
    if (u != p) {
      dfs(u, v, dst + 1);
    }
  }
}

void decomposition2(int v) {
  used[v] = 1;
  sizes(v, -1);

  m = 0;
  dfs(v, -1, 0);
  sort(vs, vs + m);

  auto can = [&] (int ver, int dst) -> bool {
    for (auto &[centroid, dist_to_centroid] : centroids[ver]) {
      if (dist_to_centroid + mdist[centroid] < d) {
        return false;
      }
    }
    return true;
  };

  int r = m, cnt = 0;
  rep(l, m) {
    while (r - 1 >= l && vs[r - 1].first >= max(vs[l].first, d - vs[l].first)) {
      r--;
      int ver = vs[r].second;
      int dst = vs[r].first;
      if (can(ver, dst)) {
        cnt++;
        for (auto &[centroid, dist_to_centroid] : centroids[ver]) {
          mdist[centroid] = min(mdist[centroid], dist_to_centroid);
        }
      }
    }
    if (l == r) {
      res = max(res, cnt);
      break;
    } else {
      res = max(res, cnt + can(vs[l].second, vs[l].first));
    }
  }

  for (auto &[vd, ver] : vs) {
    for (auto &[centroid, dist_to_centroid] : centroids[ver]) {
      mdist[centroid] = inf;
    }
  }

  for (auto &u : g[v]) {
    if (!used[u]) {
      decomposition2(centroid(u, v, s[u]));
    }
  }
}

void solve() {
  fill(mdist, mdist + N, inf);

  int n;
  cin >> n >> d;
 
  if (d > n - 1) {
    cout << 1;
    return;
  }
 
  if (d == 0) {
    cout << n;
    return;
  }
 
  reps(i, 1, n) {
    int p;
    cin >> p;
    g[p].push_back(i);
    g[i].push_back(p);
  }
  
  sizes(0, -1);
  decomposition1(centroid(0, -1, n));

  fill(used, used + N, 0);
  sizes(0, -1);
  decomposition2(centroid(0, -1, n));

  cout << res;
}
 
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
  return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 26 ms 11220 KB Output is correct
2 Correct 22 ms 11220 KB Output is correct
3 Correct 23 ms 11220 KB Output is correct
4 Correct 28 ms 11300 KB Output is correct
5 Correct 35 ms 11220 KB Output is correct
6 Correct 33 ms 11276 KB Output is correct
7 Correct 30 ms 11220 KB Output is correct
8 Correct 50 ms 11276 KB Output is correct
9 Correct 42 ms 11280 KB Output is correct
10 Correct 24 ms 11220 KB Output is correct
11 Correct 32 ms 11296 KB Output is correct
12 Correct 32 ms 11220 KB Output is correct
13 Correct 41 ms 11220 KB Output is correct
14 Correct 29 ms 11216 KB Output is correct
15 Correct 33 ms 11220 KB Output is correct
16 Correct 41 ms 11220 KB Output is correct
17 Correct 36 ms 11292 KB Output is correct
18 Correct 41 ms 11220 KB Output is correct
19 Correct 34 ms 11296 KB Output is correct
20 Correct 31 ms 11272 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 11220 KB Output is correct
2 Correct 22 ms 11220 KB Output is correct
3 Correct 23 ms 11220 KB Output is correct
4 Correct 28 ms 11300 KB Output is correct
5 Correct 35 ms 11220 KB Output is correct
6 Correct 33 ms 11276 KB Output is correct
7 Correct 30 ms 11220 KB Output is correct
8 Correct 50 ms 11276 KB Output is correct
9 Correct 42 ms 11280 KB Output is correct
10 Correct 24 ms 11220 KB Output is correct
11 Correct 32 ms 11296 KB Output is correct
12 Correct 32 ms 11220 KB Output is correct
13 Correct 41 ms 11220 KB Output is correct
14 Correct 29 ms 11216 KB Output is correct
15 Correct 33 ms 11220 KB Output is correct
16 Correct 41 ms 11220 KB Output is correct
17 Correct 36 ms 11292 KB Output is correct
18 Correct 41 ms 11220 KB Output is correct
19 Correct 34 ms 11296 KB Output is correct
20 Correct 31 ms 11272 KB Output is correct
21 Execution timed out 1090 ms 11600 KB Time limit exceeded
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 26 ms 11220 KB Output is correct
2 Correct 22 ms 11220 KB Output is correct
3 Correct 23 ms 11220 KB Output is correct
4 Correct 28 ms 11300 KB Output is correct
5 Correct 35 ms 11220 KB Output is correct
6 Correct 33 ms 11276 KB Output is correct
7 Correct 30 ms 11220 KB Output is correct
8 Correct 50 ms 11276 KB Output is correct
9 Correct 42 ms 11280 KB Output is correct
10 Correct 24 ms 11220 KB Output is correct
11 Correct 32 ms 11296 KB Output is correct
12 Correct 32 ms 11220 KB Output is correct
13 Correct 41 ms 11220 KB Output is correct
14 Correct 29 ms 11216 KB Output is correct
15 Correct 33 ms 11220 KB Output is correct
16 Correct 41 ms 11220 KB Output is correct
17 Correct 36 ms 11292 KB Output is correct
18 Correct 41 ms 11220 KB Output is correct
19 Correct 34 ms 11296 KB Output is correct
20 Correct 31 ms 11272 KB Output is correct
21 Execution timed out 1090 ms 11600 KB Time limit exceeded
22 Halted 0 ms 0 KB -