/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 3ms 2.77 MiB
#2 Accepted 3ms 2.719 MiB
#3 Wrong Answer 3ms 2.77 MiB
#4 Accepted 3ms 2.852 MiB
#5 Accepted 3ms 2.77 MiB
#6 Wrong Answer 5ms 2.773 MiB

Code

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5;
const int MAXK = 100;
const long long INF = 1e18;

int A[MAXN + 5];
long long dp[MAXN + 5][MAXK + 2], down[MAXN + 5][MAXK + 2];

vector<int> X[MAXN + 5];

void dfs(int u, int par, int k)
{
    down[u][1] = dp[u][1] = A[u];
    
    for (int i = 2; i <= k; i++)
        dp[u][i] = down[u][i] = -INF;
    
    vector< priority_queue<long long, vector<long long>, greater<> > > q(k + 1);
    
    for (int v: X[u])
        if (v != par)
        {
            dfs(v, u, k);
            
            for (int i = 1; i <= k; i++)
            {
                dp[u][i] = max(dp[u][i], dp[v][i]);
                down[u][i] = max(down[u][i], down[v][i - 1] + A[u]);
                
                q[i].push(down[v][i]);
                
                if (q[i].size() > 2)
                    q[i].pop();
            }
        }
    
    vector<long long> maxx(k + 1), max2(k + 1);
    
    for (int i = 1; i <= k; i++)
    {
        if (q[i].empty())
            maxx[i] = max2[i] = -INF;
        else if (q[i].size() == 1)
            maxx[i] = q[i].top(), max2[i] = -INF;
        else
        {
            max2[i] = q[i].top();
            q[i].pop();
            maxx[i] = q[i].top();
        }
    }
    
    for (int i = 1; i <= k; i++)
    {
        dp[u][i] = max(dp[u][i], down[u][i]);
        
        for (int j = 1; j <= i - j - 1; j++)
        {
            if (j != i - j - 1)
                dp[u][i] = max(dp[u][i], maxx[j] + maxx[i - j - 1] + A[u]);
            else
                dp[u][i] = max(dp[u][i], maxx[j] + max2[j] + A[u]);
        }
        
        if (dp[u][i] < 0)
            dp[u][i] = -INF;
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL), cout.tie(NULL);
    
    int n, k;
    cin >> n >> k;
    
    for (int i = 1; i <= n; i++)
        cin >> A[i];
    
    for (int i = 1; i <= n - 1; i++)
    {
        int u, v;
        cin >> u >> v;
        
        X[u].push_back(v);
        X[v].push_back(u);
    }
    
    dfs(1, 0, k);
    long long res = max(0LL, dp[1][k]);
    
    cout << res << "\n";
    
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1161 Max path sum (Hard Version)
Contest
Brain Booster #8
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 16:24:04
Judged At
2025-02-17 16:24:04
Judged By
Score
8
Total Time
5ms
Peak Memory
2.852 MiB