Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
23898 | M0yunAllgor1thm | 【BJ】T1 | C++ | 运行超时 | 70 | 1000 MS | 856 KB | 1414 | 2023-12-03 20:49:34 |
#include <bits/stdc++.h> #define LL long long #define PII pair<int,int> using namespace std; const int MAXN=5005; LL dp[5005][4];//0-m,1-w&down/w&indis,2-w&!down,3-no int N,Q,K,L; vector<int>gra[MAXN]; int m[MAXN],w[MAXN]; void dpfs(int u,int fa,int dis) { dp[u][0]=m[u]; if(dis<=L) dp[u][1]=w[u]; else dp[u][2]=w[u]; dp[u][3]=0; for(int v:gra[u]) { if(v==fa) continue; dpfs(v,u,dis+1); dp[u][0]+=max(max(dp[v][0],dp[v][1]),dp[v][3]); dp[u][1]=max(dp[u][1]+max(max(dp[v][0],dp[v][1]),dp[v][3]),dp[u][2]+dp[v][3]); if(dis>L) dp[u][2]+=max(dp[v][0],dp[v][1]); dp[u][3]+=max(max(dp[v][0],dp[v][1]),max(dp[v][2],dp[v][3])); } return; } int main() { // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); scanf("%d %d",&N,&Q); for(int i=1;i<=N;i++) scanf("%d",&m[i]); for(int i=1;i<=N;i++) scanf("%d",&w[i]); scanf("%d",&K); for(int i=1;i<N;i++) { int u,v; scanf("%d %d",&u,&v); gra[u].push_back(v); gra[v].push_back(u); } while(Q--) { scanf("%d",&L); for(int i=1;i<=N;i++) for(int j=0;j<4;j++) dp[i][j]=-1e17; dpfs(K,0,0); printf("%lld\n",max(max(dp[K][0],dp[K][1]),dp[K][3])); } fclose(stdin); fclose(stdout); return 0; }