Submission #702784

#TimeUsernameProblemLanguageResultExecution timeMemory
702784NursikPaths (RMI21_paths)C++14
48 / 100
1032 ms25292 KiB
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <bitset>
 #include <cstdint>
#include <cassert>
#include <functional>
#include <complex>

using namespace std;
 
#define ll long long
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define ld long double
 
const ll maxn = 2e3 + 10, maxm = 3e5 + 1;
const ll mod = 1e9 + 7, cmod = 998244353, inf = 1e9, blcok = 400, p2 = 31;
const ld eps = 1e-9;

int n, k;
int x[maxm], y[maxm], c[maxm], used[maxm], sz[maxm];
ll dp[maxn][maxn];
vector<pair<int, int>> g[maxm];
ll dps[maxm], answ[maxm];
void dfs(int v, int p){
    for (int j = 0; j <= k; ++j){
        dp[v][j] = -1;
    }
    dp[v][0] = 0;
    dp[v][1] = 0;
    sz[v] = 1;
    for (auto to : g[v]){
        if (to.f != p){
            dfs(to.f, v);
            for (int j = min(k, sz[v]); j >= 0; --j){
                if (dp[v][j] != -1){
                    for (int j2 = 1; j2 <= min(k, sz[to.f]); ++j2){
                        if (j + j2 <= k){
                            dp[v][j + j2] = max(dp[v][j + j2], dp[to.f][j2] + c[to.s] + dp[v][j]);
                        }
                        else{
                            break;
                        }
                    }
                }
            }
            sz[v] += sz[to.f];
        }
    }
}
void dfs2(int v = 1, int p = 0){
    dps[v] = 0;
    for (auto to : g[v]){
        if (to.f != p){
            dfs2(to.f, v);
            dps[v] = max(dps[v], dps[to.f] + c[to.s]);
        }
    }
}
void pdfs2(int v = 1, int p = 0){
    answ[v] = dps[v];
    multiset<ll> setik;
    for (auto to : g[v]){
        setik.insert(dps[to.f] + c[to.s]);
    }
    for (auto to : g[v]){
        if (to.f != p){
            ll prevdp = dps[v], prevdp2 = dps[to.f];
            ll x = dps[to.f] + c[to.s];
            setik.erase(setik.find(x));
            dps[v] = *setik.rbegin();
            dps[to.f] = max(dps[to.f], dps[v] + c[to.s]);
            pdfs2(to.f, v);
            setik.insert(x);
            dps[v] = prevdp;
            dps[to.f] = prevdp2;
        }
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    for (int i = 1; i < n; ++i){
        cin >> x[i] >> y[i] >> c[i];
        g[x[i]].pb(mp(y[i], i));
        g[y[i]].pb(mp(x[i], i));
    }
    if (k == 1){
        dfs2();
        pdfs2();
        for (int i = 1; i <= n; ++i){
            cout << answ[i] << " ";
        }
        exit(0);
    }
    for (int i = 1; i <= n; ++i){
        dfs(i, 0);
        cout << dp[i][k] << " ";
    }
}
/*
*/


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...