/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 4ms 5.777 MiB
#2 Wrong Answer 4ms 4.527 MiB
#3 Accepted 5ms 3.527 MiB
#4 Accepted 4ms 3.277 MiB
#5 Accepted 7ms 6.027 MiB
#6 Wrong Answer 4ms 5.777 MiB

Code

// I AM A MUSLIM

#include "bits/stdc++.h"

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#define fast_io std::ios::sync_with_stdio(0);std::cin.tie(0)
#define lli long long int
#define flush fflush(stdout)
#define line printf("\n")
#define yn(a, b) printf("%s\n", (a) >= (b) ? "Yes":"No")
#define amodm(a, M) (((a)%M+M)%M)
// #define int lli

using pii = std::pair<int,int>;

const int MOD = 1000000007;
const int mxN = 100100;

int n, k;
std::vector<int> g[mxN];
lli dp[mxN][305], a[mxN];

void dfs(int u, int p=-1) {
    std::vector<int> child;
    for (auto &v : g[u]) {
        if (v == p) continue;
        child.push_back(v);
        dfs(v, u);
    }
    
    if (child.size()) {
        if (child.size() == 1) {
            for (int i = 0; i < k; i++) {
                if (dp[child[0]][i]) dp[u][1+i] = dp[child[0]][i] + a[u];
            }
        } else {
            for (int i = 0; i < k; i++) {
                if (dp[child[0]][i]) dp[u][1+i] = dp[child[0]][i] + a[u];
            }
            for (int i = 0; i < k; i++) {
                if (dp[child[1]][i]) dp[u][1+i] = std::max(dp[u][i+1], dp[child[1]][i] + a[u]);
            }
            for (int i = 0; i < k; i++) {
                int j = k-1 -i;
                if (dp[child[0]][i] && dp[child[1]][j]) dp[u][1+i+j] = std::max(dp[u][1+i+j], dp[child[0]][i] + dp[child[1]][j] + a[u]);
                if (dp[child[1]][i] && dp[child[0]][j]) dp[u][1+i+j] = std::max(dp[u][1+i+j], dp[child[1]][i] + dp[child[0]][j] + a[u]);
            }
        }
    } else {
        dp[u][1] = a[u];
    }
}

signed main() {
    int testCases=1;
    
    for (int TC = 1; TC <= testCases; TC++) {
        scanf("%d",&n);
        scanf("%d",&k);
        for (int i = 1; i <= n; i++) scanf("%lld",&a[i]);
        for (int i = 0, u, v; i < n-1; i++) {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        
        dfs(1);
        lli ans = 0;
        for (int i = 1; i <= n; i++) {
            if (dp[i][k] > ans) ans = dp[i][k];
        }
        
        printf("%lld\n", ans);
        
    }
    
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1160 Max path sum (Easy Version)
Contest
Brain Booster #8
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 16:31:15
Judged At
2025-02-17 16:31:15
Judged By
Score
8
Total Time
7ms
Peak Memory
6.027 MiB