Submission #1272897

#TimeUsernameProblemLanguageResultExecution timeMemory
1272897elotelo966Cat in a tree (BOI17_catinatree)C++20
100 / 100
190 ms169712 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define OYY LLONG_MAX #define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); #define fi first #define se second #define FOR for(int i=1;i<=n;i++) #define mid (start+end)/2 #define pb push_back #define lim 200005 typedef long long lo; int n,d; int cev; vector<int> v[lim]; deque<int> dp[lim]; inline bool ch(int node,int dist){ return dist>=0 && (int)dp[node].size()-1>=dist; } inline void f(int node){ dp[node].pb(1); int kim=-1,mx_sz=1; for(auto go:v[node]){ f(go); if(ch(go,d-1))dp[node][0]+=dp[go][d-1]; if(mx_sz<=(int)dp[go].size()){ mx_sz=(int)dp[go].size(); kim=go; } } int cur=0; for(auto go:v[node]){ if(go==kim)continue; cur=max(cur,(int)dp[go].size()); } if(~kim){ dp[kim].push_front(dp[node][0]); swap(dp[kim],dp[node]); } vector<int> gec(cur+1,0); for(int j=1;j<=cur;j++){ int tot=0,tot2=0,maxi=0; for(auto go:v[node]){ if(kim==go){ if(ch(node,d-j))tot+=dp[node][d-j]; if(ch(node,j))tot2+=dp[node][j]; if(ch(node,j))maxi=max(maxi,dp[node][j]); continue; } if(ch(go,d-j-1))tot+=dp[go][d-j-1]; if(ch(go,j-1))tot2+=dp[go][j-1]; if(ch(go,j-1))maxi=max(maxi,dp[go][j-1]); } for(auto go:v[node]){ if(kim==go){ if(ch(node,d-j))tot-=dp[node][d-j]; if(ch(node,j))tot+=dp[node][j]; if(ch(node,j) && j<=d-j)gec[j]=max(gec[j],tot); if(ch(node,j))tot-=dp[node][j]; if(ch(node,d-j))tot+=dp[node][d-j]; continue; } if(ch(go,d-j-1))tot-=dp[go][d-j-1]; if(ch(go,j-1))tot+=dp[go][j-1]; if(ch(node,j) && j<=d-j)gec[j]=max(gec[j],tot); if(ch(go,j-1))tot-=dp[go][j-1]; if(ch(go,d-j-1))tot+=dp[go][d-j-1]; } if(j>=d-j){ gec[j]=max(gec[j],tot2); } } for(int j=cur;j>=0;j--){ dp[node][j]=max(dp[node][j],gec[j]); if(ch(node,j+1))dp[node][j]=max(dp[node][j],dp[node][j+1]); cev=max(cev,dp[node][j]); } } int32_t main(){ faster cin>>n>>d; d=min(d,n+2); FOR{ if(i==1)continue; int x;cin>>x; x++; v[x].pb(i); } f(1); cout<<cev<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...