#include "bits/stdc++.h"
using namespace std;
#define FAST ios::sync_with_stdio(false); cin.tie(0);
#define ll long long int
#define ld long double
#define pb push_back
#define ins insert
#define ph push
#define mmst(x,v) memset(x,v,sizeof(x))
#define all(x) (x).begin(), (x).end()
#define FOR(i,s,e) for(ll i=s;i<e;i++)
#define cbr cerr << "hi\n"
#define MAXN (100006)
#define LLINF ((long long)1e18)
typedef pair <ll, ll> pi;
typedef pair <ll, pi> spi;
ll n, A[MAXN], dp[MAXN][102][3], V,ans, alu[MAXN][102][3];
vector<ll>v[MAXN];
// 0 - went down (aka. kid pressed)
// 1 - ready to go up (aka. pressed)
void up(ll &x, ll y) { x=max(x,y); }
void dfs(ll x, ll p) {
FOR(i,0,V+1) dp[x][i][0]=dp[x][i][1]=alu[x][i][0]=alu[x][i][1]=-LLINF;
ll sum = 0; for(auto i:v[x])if(i!=p)sum+=A[i];
//~ if(p == -1) {
//~ dp[x][1][1] = sum; if(V>=1)ans = max(ans,sum);
//~ dp[x][0][1] = 0;
//~ } else {
//~ FOR(i,0,V+1) {
//~ up(dp[x][i][0],dp[p][i][1]);
//~ up(dp[x][i][1],dp[p][i][0]); // np
//~ up(dp[x][i][1],dp[p][i][1]);
//~ if(i>0)up(dp[x][i][1],dp[p][i-1][0]+sum); // press
//~ if(i>0)up(dp[x][i][1],dp[p][i-1][1]+sum);
//~ // up(dp[x][i][2],max({dp[p][i][2],dp[p][i][0]}));
//~ ans=max({ans,dp[x][i][0],dp[x][i][1]});
//~ }
//~ }
if(v[x].size()==1&&p!=-1) { alu[x][1][1] = dp[x][1][1] = sum; alu[x][1][1] += A[p]; alu[x][0][1] = dp[x][0][1] = 0; if(V>=1)ans=max(ans,sum+A[p]);}
for(auto i : v[x]) if(i!=p) {
dfs(i,x); // sum -= A[i];
FOR(b,0,V+1) {
up(dp[x][b][1], max(dp[i][b][0],dp[i][b][1]));
if(b>0)up(dp[x][b][1],max(dp[i][b-1][0],dp[i][b-1][1])+sum);
ans=max({ans,dp[x][b][1]});
}
//~ sum += A[i];
}
//~ 0 - went down
//~ 1 - stayed
if(p!=-1)sum += A[p];
for(auto i : v[x]) if(i!=p) {
sum -= A[i];
FOR(b,0,V+1) {
// up(alu[x][b][0],alu[i][b][1]);
up(alu[x][b][1],max(alu[i][b][0],alu[i][b][1]));
if(b>0)up(alu[x][b][1],max(alu[i][b-1][0],alu[i][b-1][1])+sum);
ans=max({ans,alu[x][b][1]});
}
sum += A[i];
}
return;
}
int main()
{
// freopen("in","r",stdin);
FAST
cin>>n>>V; if(n==1) { cout << 0 << '\n'; return 0; }
FOR(i,1,n+1)cin>>A[i]; for(ll i=0;i<n-1;i++) { ll a, b; cin >> a >> b; v[a].pb(b); v[b].pb(a); }
// ll ans = 0;
FOR(i,1,n+1) {
if((i>1&&n>1000))break;
// for(ll i=0;i<MAXN;i++) for(ll j=0;j<102;j++) dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=-LLINF;
dfs(i,-1);
// ll ans = 0;
// for(ll i=1;i<=n;i++) for(ll j=0;j<=V;j++)ans=max({ans,dp[i][j][0],dp[i][j][1],dp[i][j][2]});
}
//~ dfs(6,-1);
cout<<ans<<'\n';
}
/*
*
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
*
*/
Compilation message
chase.cpp: In function 'int main()':
chase.cpp:11:20: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
#define FOR(i,s,e) for(ll i=s;i<e;i++)
^
chase.cpp:72:2: note: in expansion of macro 'FOR'
FOR(i,1,n+1)cin>>A[i]; for(ll i=0;i<n-1;i++) { ll a, b; cin >> a >> b; v[a].pb(b); v[b].pb(a); }
^~~
chase.cpp:72:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
FOR(i,1,n+1)cin>>A[i]; for(ll i=0;i<n-1;i++) { ll a, b; cin >> a >> b; v[a].pb(b); v[b].pb(a); }
^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
2816 KB |
Output is correct |
2 |
Correct |
5 ms |
2816 KB |
Output is correct |
3 |
Correct |
4 ms |
2688 KB |
Output is correct |
4 |
Correct |
4 ms |
2688 KB |
Output is correct |
5 |
Correct |
4 ms |
2688 KB |
Output is correct |
6 |
Correct |
5 ms |
2688 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
2816 KB |
Output is correct |
2 |
Correct |
5 ms |
2816 KB |
Output is correct |
3 |
Correct |
4 ms |
2688 KB |
Output is correct |
4 |
Correct |
4 ms |
2688 KB |
Output is correct |
5 |
Correct |
4 ms |
2688 KB |
Output is correct |
6 |
Correct |
5 ms |
2688 KB |
Output is correct |
7 |
Correct |
1587 ms |
7636 KB |
Output is correct |
8 |
Correct |
153 ms |
7672 KB |
Output is correct |
9 |
Correct |
132 ms |
7588 KB |
Output is correct |
10 |
Correct |
1419 ms |
7672 KB |
Output is correct |
11 |
Correct |
644 ms |
7552 KB |
Output is correct |
12 |
Correct |
194 ms |
7552 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
799 ms |
491932 KB |
Output is correct |
2 |
Correct |
801 ms |
492060 KB |
Output is correct |
3 |
Correct |
577 ms |
487020 KB |
Output is correct |
4 |
Correct |
455 ms |
486560 KB |
Output is correct |
5 |
Correct |
778 ms |
486648 KB |
Output is correct |
6 |
Correct |
821 ms |
486776 KB |
Output is correct |
7 |
Correct |
786 ms |
486648 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
2816 KB |
Output is correct |
2 |
Correct |
5 ms |
2816 KB |
Output is correct |
3 |
Correct |
4 ms |
2688 KB |
Output is correct |
4 |
Correct |
4 ms |
2688 KB |
Output is correct |
5 |
Correct |
4 ms |
2688 KB |
Output is correct |
6 |
Correct |
5 ms |
2688 KB |
Output is correct |
7 |
Correct |
1587 ms |
7636 KB |
Output is correct |
8 |
Correct |
153 ms |
7672 KB |
Output is correct |
9 |
Correct |
132 ms |
7588 KB |
Output is correct |
10 |
Correct |
1419 ms |
7672 KB |
Output is correct |
11 |
Correct |
644 ms |
7552 KB |
Output is correct |
12 |
Correct |
194 ms |
7552 KB |
Output is correct |
13 |
Correct |
799 ms |
491932 KB |
Output is correct |
14 |
Correct |
801 ms |
492060 KB |
Output is correct |
15 |
Correct |
577 ms |
487020 KB |
Output is correct |
16 |
Correct |
455 ms |
486560 KB |
Output is correct |
17 |
Correct |
778 ms |
486648 KB |
Output is correct |
18 |
Correct |
821 ms |
486776 KB |
Output is correct |
19 |
Correct |
786 ms |
486648 KB |
Output is correct |
20 |
Incorrect |
874 ms |
486636 KB |
Output isn't correct |
21 |
Halted |
0 ms |
0 KB |
- |