제출 #162916

#제출 시각아이디문제언어결과실행 시간메모리
162916MvCCat in a tree (BOI17_catinatree)C++11
100 / 100
875 ms411112 KiB
#pragma GCC target("avx2") #pragma GCC optimization("O3") #pragma GCC optimization("unroll-loops") #include <bits/stdc++.h> #define rc(x) return cout<<x<<endl,0 #define pb push_back #define mkp make_pair #define in insert #define er erase #define fd find #define fr first #define sc second typedef long long ll; typedef long double ld; const ll INF=0x3f3f3f3f3f3f3f3f; const ll llinf=(1LL<<62); const int inf=(1<<30); const int nmax=2e5+50; const int mod=1e9+7; using namespace std; int n,k,v[nmax],f[nmax][500],x,y,i,sf[nmax],pr[nmax],g[nmax][500],r,rs,sz[nmax]; vector<int>a[nmax]; void dfs(int x) { int sm=0; for(int i=0;i<(int)a[x].size();i++) { int y=a[x][i]; dfs(y); sm+=f[y][k-1]; } f[x][0]=1+sm; for(int i=1;i<=k;i++) { for(int j=0;j<(int)a[x].size();j++) { int y=a[x][j]; pr[j]=f[y][max(i-1,k-i-1)]; if(j)pr[j]+=pr[j-1]; } for(int j=(int)a[x].size()-1;j>=0;j--) { int y=a[x][j]; sf[j]=f[y][max(i-1,k-i-1)]; if(j<(int)a[x].size()-1)sf[j]+=sf[j+1]; } for(int j=0;j<(int)a[x].size();j++) { int y=a[x][j]; sm=f[y][i-1]; if(j)sm+=pr[j-1]; if(j<(int)a[x].size()-1)sm+=sf[j+1]; f[x][i]=max(f[x][i],sm); } } for(int i=k;i>=0;i--)f[x][i]=max(f[x][i],f[x][i+1]); } void rfs(int x) { sz[x]=1; for(int i=0;i<(int)a[x].size();i++) { int y=a[x][i]; rfs(y); } for(int j=0;j<=r;j++)g[x][j]=-inf; g[x][1]=0; g[x][0]=inf; for(int i=0;i<(int)a[x].size();i++) { int y=a[x][i]; for(int j=min(sz[x],r);j>=0;j--) { for(int t=0;t<=min(sz[y],r-j);t++) { if(g[x][j]+g[y][t]+1>=k) { g[x][j+t]=max(g[x][j+t],min(g[x][j],g[y][t]+1)); } } } sz[x]+=sz[y]; } for(int i=0;i<=min(sz[x],r);i++) { //g[x][i]=max(g[x][i],g[x][i+1]); if(g[x][i]>=0)rs=max(rs,i); } } int main() { //freopen("sol.in","r",stdin); //freopen("sol.out","w",stdout); //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); cin>>n>>k; //for(i=1;i<=n;i++)cin>>v[i]; for(i=2;i<=n;i++) { cin>>x; x++; a[x].pb(i); } if(k*k<=n) { dfs(1); rs=f[1][0]; } else { r=n/k+2; rfs(1); } cout<<rs<<endl; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

catinatree.cpp:2:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
 #pragma GCC optimization("O3")
 
catinatree.cpp:3:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
 #pragma GCC optimization("unroll-loops")
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...