이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAX = 2e5 + 2;
vector<int> G[ MAX ];
deque<int> dp[ MAX ];
int second[ MAX ];
int height[ MAX ];
int child[ MAX ];
int maxx[ MAX ];
int n, d;
void calc( int nod ) {
for( const int& it : G[ nod ] ) {
calc( it );
if( height[ nod ] < height[ it ] + 1 ) {
child[ nod ] = it;
second[ nod ] = height[ nod ];
height[ nod ] = height[ it ] + 1;
} else if( second[ nod ] < height[ it ] + 1 )
second[ nod ] = height[ it ] + 1;
}
}
void dfs1( int nod ) {
for( const int& it : G[ nod ] )
dfs1( it );
for( int i = 0; i <= second[ nod ]; i++ )
maxx[ i ] = 0;
for( const int &it : G[ nod ] )
for( int j = 1; j <= min( height[ it ] + 1, min( second[ nod ], d / 2 ) ); j++ )
maxx[ j ] = max( maxx[ j ], dp[ it ][ j - 1 ] - ( ( d - j - 1 <= height[ it ] ) ? dp[ it ][ d - j - 1 ] : 0 ) );
int dp0 = 1;
for( const int &it : G[ nod ] )
if( height[ it ] >= d - 1 )
dp0 += dp[ it ][ d - 1 ];
if( child[ nod ] )
swap( dp[ nod ], dp[ child[ nod ] ] );
dp[ nod ].push_front( dp0 );
for( const int &it : G[ nod ] )
if( it != child[ nod ] )
for( int j = 1; j <= min( height[ it ] + 1, d - 1 ); j++ )
dp[ nod ][ j ] += dp[ it ][ j - 1 ];
for( int j = 1; j <= min( d / 2, second[ nod ] ); j++ )
dp[ nod ][ j ] = ( ( d - j <= height[ nod ] ) ? dp[ nod ][ d - j ] : 0 ) + maxx[ j ];
for( int j = second[ nod ]; j >= 0; j-- )
if( j + 1 <= height[ nod ] )
dp[ nod ][ j ] = max( dp[ nod ][ j + 1 ], dp[ nod ][ j ] );
}
int main()
{
cin >> n >> d;
int x;
for( int i = 2; i <= n; i++ ) {
cin >> x;
G[ ++x ].push_back( i );
}
calc( 1 );
dfs1( 1 );
cout << dp[ 1 ][ 0 ] << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |