Submission #101412

#TimeUsernameProblemLanguageResultExecution timeMemory
101412dwscChase (CEOI17_chase)C++14
70 / 100
2362 ms99188 KiB
#include <bits/stdc++.h> using namespace std; int n,v; int p[100010]; vector<int> adj[100010]; long long memo[100010][110]; long long dp(int x,int dist,int pa){ if (dist == -1) return -1e18; if (memo[x][dist] != -1) return memo[x][dist]; // cout << x << " " << dist << " " << pa << '\n'; long long ans = 0; long long sum = 0; for (int i = 0; i < (int)(adj[x].size()); i++){ int nx = adj[x][i]; if (nx == pa) continue; sum += p[nx]; } // cout << sum << "\n"; for (int i = 0; i < (int)(adj[x].size()); i++){ int nx = adj[x][i]; if (nx == pa) continue; ans = max(ans,dp(nx,dist-1,x)+sum); ans = max(ans,dp(nx,dist,x)); } return memo[x][dist] = ans; } int main(){ cin >> n >> v; for (int i = 0; i < n; i++){ cin >> p[i]; } for (int i = 0; i < n-1; i++){ int a,b; cin >> a >> b; a--; b--; adj[a].push_back(b); adj[b].push_back(a); } if (n <= 1000){ long long ans = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ for (int k = 0; k <= v; k++) memo[j][k] = -1; } // cout << dp(i,v,-1) << "\n"; ans = max(ans,dp(i,v,-1)); } cout << ans; } else{ for (int j = 0; j < n; j++){ for (int k = 0; k <= v; k++) memo[j][k] = -1; } cout << dp(0,v,-1); } } /* 12 2 2 3 3 8 1 5 6 7 8 3 5 4 2 1 2 7 3 4 4 7 7 6 5 6 6 8 6 9 7 10 10 11 10 12 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...