176122025-08-09 16:14:58BucsMateTársaság (50)cpp17Accepted 50/5017ms820 KiB
#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> adj;
vector<long long> cost;

long long checkSolution(long long maxTime, int currNode, int &nrBoss)
{
    long long maxDist = 0;
    for(int child : adj[currNode]){
        maxDist = max(maxDist, cost[child] + checkSolution(maxTime, child, nrBoss));
    }

    if(maxDist + cost[currNode] > maxTime){
        //cout << currNode << " ";
        nrBoss++;
        return -cost[currNode];
    }
    return maxDist;
}

int main()
{
    int N, K;
    cin >> N >> K;
    adj.resize(N+1);
    cost.assign(N+1, 0);
    for(int i = 2; i <= N; ++i){
        int parent;
        cin >> parent >> cost[i];
        adj[parent].push_back(i);
    }

    long long left = 0, right = 1e14;
    while(left < right){
        long long mid = (left + right)/2;
        int nrBoss = 0;
        checkSolution(mid, 1, nrBoss);
        //cout << endl << "nrBoss: " << nrBoss;

        if(nrBoss > K){
            left = mid+1;
            //cout << "bal\n\n";
        }
        else{
            right = mid;
            //cout << "jobb\n\n";
        }
    }
    //cout << endl;
    cout << right;

    return 0;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms316 KiB
2Accepted0/08ms564 KiB
3Accepted3/31ms316 KiB
4Accepted3/31ms316 KiB
5Accepted3/31ms316 KiB
6Accepted3/31ms316 KiB
7Accepted3/31ms316 KiB
8Accepted3/32ms500 KiB
9Accepted3/34ms316 KiB
10Accepted3/34ms316 KiB
11Accepted3/36ms596 KiB
12Accepted3/39ms624 KiB
13Accepted4/410ms564 KiB
14Accepted4/412ms564 KiB
15Accepted4/413ms760 KiB
16Accepted4/416ms820 KiB
17Accepted4/417ms820 KiB