제출 #164412

#제출 시각아이디문제언어결과실행 시간메모리
164412LawlietChase (CEOI17_chase)C++14
100 / 100
1683 ms363112 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const int MAXK = 110; const int MAXN = 100010; int n, k; int v[MAXN]; int maxDP[MAXN][MAXK][2]; lli ans; lli sum[MAXN]; lli dp[MAXN][MAXK]; vector< int > adj[MAXN]; void DFSCalculate(int cur, int p) { for(int i = 0 ; i < adj[cur].size() ; i++) { int viz = adj[cur][ i ]; if( viz == p ) continue; sum[ cur ] += v[ viz ]; DFSCalculate( viz , cur ); } for(int j = 1 ; j <= k ; j++) { for(int i = 0 ; i < adj[cur].size() ; i++) { int viz = adj[cur][ i ]; if( viz == p ) continue; if( dp[viz][j] > dp[ maxDP[cur][j][1] ][ j ] ) maxDP[ cur ][ j ][1] = viz; if( dp[ maxDP[cur][j][1] ][ j ] > dp[ maxDP[cur][j][0] ][ j ]) swap( maxDP[ cur ][ j ][0] , maxDP[ cur ][ j ][1] ); } dp[ cur ][ j ] = dp[ maxDP[cur][j - 1][0] ][ j - 1 ] + sum[ cur ]; dp[ cur ][ j ] = max( dp[ cur ][ j ] , dp[ maxDP[cur][j][0] ][ j ] ); } } void DFSRotate(int cur, int p) { ans = max( ans , dp[cur][k] ); for(int i = 0 ; i < adj[cur].size() ; i++) { int viz = adj[cur][ i ]; if( viz == p ) continue; vector< lli > oldDPCur; vector< lli > oldDPViz; vector< int > oldMaxDPCur[2]; vector< int > oldMaxDPViz[2]; lli oldSumCur = sum[ cur ]; lli oldSumViz = sum[ viz ]; for(int j = 0 ; j <= k ; j++) { oldDPCur.push_back( dp[cur][j] ); oldDPViz.push_back( dp[viz][j] ); for(int p = 0 ; p < 2 ; p++) { oldMaxDPCur[p].push_back( maxDP[cur][j][p] ); oldMaxDPViz[p].push_back( maxDP[viz][j][p] ); } } sum[ cur ] -= v[ viz ]; sum[ viz ] += v[ cur ]; for(int j = 1 ; j <= k ; j++) { lli newDPCur = 0; if( maxDP[ cur ][ j - 1 ][0] == viz ) newDPCur = dp[ maxDP[cur][j - 1][1] ][ j - 1 ] + sum[ cur ]; else newDPCur = dp[ maxDP[cur][j - 1][0] ][ j - 1 ] + sum[ cur ]; if( maxDP[ cur ][ j ][0] == viz ) newDPCur = max( newDPCur , dp[ maxDP[cur][j][1] ][ j ] ); else newDPCur = max( newDPCur , dp[ maxDP[cur][j][0] ][ j ] ); dp[ cur ][ j ] = newDPCur; } for(int j = 1 ; j <= k ; j++) { if( dp[cur][j] > dp[ maxDP[viz][j][1] ][ j ] ) maxDP[ viz ][ j ][1] = cur; if( dp[ maxDP[viz][j][1] ][ j ] > dp[ maxDP[viz][j][0] ][ j ]) swap( maxDP[ viz ][ j ][0] , maxDP[ viz ][ j ][1] ); dp[ viz ][ j ] = max( dp[ viz ][ j ] , dp[ maxDP[viz][j][0] ][ j ] ); dp[ viz ][ j ] = max( dp[ viz ][ j ] , dp[ maxDP[viz][j - 1][0] ][ j - 1 ] + sum[ viz ]); } DFSRotate( viz , cur ); sum[ cur ] = oldSumCur; sum[ viz ] = oldSumViz; for(int j = 0 ; j <= k ; j++) { dp[cur][j] = oldDPCur[j]; dp[viz][j] = oldDPViz[j]; for(int p = 0 ; p < 2 ; p++) { maxDP[cur][j][p] = oldMaxDPCur[p][j]; maxDP[viz][j][p] = oldMaxDPViz[p][j]; } } } } int main() { scanf("%d %d",&n,&k); for(int i = 1 ; i <= n ; i++) scanf("%d",&v[i]); for(int i = 1 ; i < n ; i++) { int U, V; scanf("%d %d",&U,&V); adj[ U ].push_back( V ); adj[ V ].push_back( U ); } DFSCalculate( 1 , 0 ); DFSRotate( 1 , 0 ); printf("%lld\n",ans); }

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

chase.cpp: In function 'void DFSCalculate(int, int)':
chase.cpp:23:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < adj[cur].size() ; i++)
                  ~~^~~~~~~~~~~~~~~~~
chase.cpp:35:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0 ; i < adj[cur].size() ; i++)
                   ~~^~~~~~~~~~~~~~~~~
chase.cpp: In function 'void DFSRotate(int, int)':
chase.cpp:55:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < adj[cur].size() ; i++)
                  ~~^~~~~~~~~~~~~~~~~
chase.cpp: In function 'int main()':
chase.cpp:129:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&k);
  ~~~~~^~~~~~~~~~~~~~~
chase.cpp:132:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&v[i]);
   ~~~~~^~~~~~~~~~~~
chase.cpp:137:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&U,&V);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...