제출 #1260676

#제출 시각아이디문제언어결과실행 시간메모리
1260676DangKhoizzzzCat in a tree (BOI17_catinatree)C++20
0 / 100
3 ms7488 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 3e5 + 7; int n, D, dep[maxn], jump[maxn][23]; vector <int> g[maxn]; vector <int> chosen; int leaf = 1; void dfs(int u, int p) { if(g[u].size() == 1) leaf = u; for(int v: g[u]) { if(v == p) continue; dep[v] = dep[u] + 1; jump[v][0] = u; dfs(v, u); } } void build() { dep[0] = -1; dfs(1, 1); for(int j = 1; j <= 19; j++) { for(int i = 1; i <= n; i++) { jump[i][j] = jump[jump[i][j-1]][j-1]; } } } int lca(int u, int v) { if(dep[u] > dep[v]) return lca(v, u); for(int i = 20; i >= 0; i--) { if(dep[jump[v][i]] >= dep[u]) { v = jump[v][i]; } } if(u == v) return u; for(int i = 20; i >= 0; i--) { if(jump[v][i] != jump[u][i]) { v = jump[v][i]; u = jump[u][i]; } } return jump[u][0]; } int dist(int u, int v) { return dep[u] + dep[v] - 2*dep[lca(u, v)]; } void dfs_ans(int u, int p) { bool add = true; for(int node: chosen) { if(dist(node, u) < D) add = false; } if(add) chosen.push_back(u); for(int v: g[u]) { if(v == p) continue; dfs_ans(v, u); } } void solve() { cin >> n >> D; for(int i = 1; i < n; i++) { int v; cin >> v; g[i+1].push_back(v+1); g[v+1].push_back(i+1); } build(); int ans = 0; for(int i = 1; i <= n; i++) { dfs_ans(i , i); ans = max(ans , (int)chosen.size()); chosen.clear(); } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...