Submission #129647

#TimeUsernameProblemLanguageResultExecution timeMemory
129647VardanyanCat in a tree (BOI17_catinatree)C++14
0 / 100
6 ms5112 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2*1000*100+5; vector<int> g[N]; int mark[N]; int depth[N]; int par[N]; void dfs(int v,int p = -1){ if(p!=-1) depth[v] = depth[p]+1; par[v] = p; for(int i = 0;i<g[v].size();i++){ int to = g[v][i]; if(to == p) continue; dfs(to,v); } } bool cmp(int a,int b){ return depth[a]>depth[b]; } bool col[N]; int d; int mr = 0; int nw; void go(int v,int dd = 0,int p = -1){ if(dd>=d) return; mark[v] = 1; mr++; for(int i = 0;i<g[v].size();i++){ int to = g[v][i]; if(to == p || to == nw) continue; go(to,dd+1,v); } } int dp[5005][5005]; int ans = 1; int n; void calc(int v,int p = -1){ if(g[v].size() == 1){ if(g[v][0] == p){ dp[v][0] = 1; if(v == 0) ans = max(ans,dp[v][0]); return; } } for(int i = 0;i<g[v].size();i++){ int to = g[v][i]; if(to == p) continue; calc(to,v); } for(int j = 1;j<=n;j++){ for(int i = 0;i<g[v].size();i++){ int to = g[v][i]; if(to == p) continue; dp[v][j]+=dp[to][j-1]; if(v == 0 && j>=d) ans = max(ans,dp[v][j]); } } for(int j = d;j<=d;j++){ for(int i = 0;i<g[v].size();i++){ int to = g[v][i]; if(to == p) continue; dp[v][0]+=dp[to][j]; if(v == 0) ans = max(ans,dp[v][0]); } } dp[v][0] = max(dp[v][0],1); } int main(){ ios_base::sync_with_stdio(false); cin>>n>>d; for(int i = 1;i<=n-1;i++){ int x; cin>>x; g[i].push_back(x); g[x].push_back(i); } dfs(0); long long x = (n/d)*n; if(x>=0){ calc(0); cout<<ans<<endl; return 0; } vector<int> v; for(int i = 0;i<n;i++) v.push_back(i); sort(v.begin(),v.end(),cmp); int ans = 0; int num = 1; for(int jj = 0;jj<n;jj++){ int i = v[jj]; if(mark[i]) continue; mark[i] = 1; ans++; nw = i; go(par[i],1); // if(mr == n) break; // for(int i = 0;i<n;i++) cout<<mark[i]<<" "; // cout<<endl; } cout<<max(1,ans)<<endl; return 0; }

Compilation message (stderr)

catinatree.cpp: In function 'void dfs(int, int)':
catinatree.cpp:11:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i<g[v].size();i++){
                   ~^~~~~~~~~~~~
catinatree.cpp: In function 'void go(int, int, int)':
catinatree.cpp:29:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i<g[v].size();i++){
                   ~^~~~~~~~~~~~
catinatree.cpp: In function 'void calc(int, int)':
catinatree.cpp:46:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i<g[v].size();i++){
                   ~^~~~~~~~~~~~
catinatree.cpp:52:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[v].size();i++){
                       ~^~~~~~~~~~~~
catinatree.cpp:60:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[v].size();i++){
                       ~^~~~~~~~~~~~
catinatree.cpp: In function 'int main()':
catinatree.cpp:89:9: warning: unused variable 'num' [-Wunused-variable]
     int num = 1;
         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...