Submission #1186704

#TimeUsernameProblemLanguageResultExecution timeMemory
1186704hikari1234Cat in a tree (BOI17_catinatree)C++20
51 / 100
1105 ms251436 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ff first #define ss second int n,d; vector<int> adj[200005]; deque<int> dp[200005]; void dfs(int node, int pre){ dp[node].push_front(1); for(int &i: adj[node]){ if(i==pre) continue; dfs(i,node); dp[i].push_front(dp[i][0]); if(dp[node].size()<dp[i].size()){ swap(dp[node],dp[i]); } for(int j=0; j<dp[i].size(); j++){ int x=dp[node][j], y=dp[node][j]; int p=max(d-j, j); if(p<dp[i].size()){ x=max(x,dp[i][p]+dp[node][j]); } if(p<dp[node].size()){ y=max(y,dp[node][p]+dp[i][j]); } dp[node][j]=max({dp[node][j],x,y}); } for(int j=dp[node].size()-1; j>=0; j--){ if(j+1<dp[node].size()){ dp[node][j]=max(dp[node][j],dp[node][j+1]); } } } } signed main() { ios::sync_with_stdio(0); cin.tie(NULL); cin>>n>>d; for(int i=2; i<=n; i++){ int u; cin>>u; u++; adj[i].push_back(u); adj[u].push_back(i); } dfs(1,0); cout<<dp[1][0]<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...