10252022-02-25 07:36:41Szin AttilaTársaság (50)cpp14Elfogadva 50/5012ms3988 KiB
#include <bits/stdc++.h>
using namespace std;
#define InTheNameOfGod ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
using ll = long long;

const ll maxN = 2e5 + 5;
const ll MOD = 1e9 + 7;

ll n, k;
vector<vector<pair<ll, ll> > > g;
vector<ll> val, b;
ll a;

void dfs1(ll x)
{
    for(pair<ll, ll> sz : g[x]) {
        val[sz.first] = val[x] + sz.second;
        dfs1(sz.first);
    }
}

ll dfs(ll x, ll mid) {
    ll maxi = 0;

    for(pair<ll, ll> sz : g[x]) {
        ll temp = dfs(sz.first, mid);
        maxi = max(maxi, temp);
    }

    maxi += b[x];

    if(maxi > mid) {
        a++;
        maxi = 0;
    }

    return maxi;
}

int main() {
   InTheNameOfGod;
    
    cin >> n >> k;

    g.resize(n+1);
    val.resize(n+1, 0);
    b.resize(n+1, 0);

    for(ll i = 2; i <= n; i++) {
        ll x,y;
        cin >> x >> y;
        g[x].push_back({i, y});
        b[i] = y;
    }

    dfs1(1);

    ll maxi = 0;
    for(ll i = 1; i <= n; i++) maxi = max(maxi, val[i]);

    ll l = 0, r = maxi, mid, mo;
    while(l < r) {
        mid = (l + r) / 2;
        val.assign(n+1, 0);
        a = 0;
        dfs(1, mid);


        if(a > k) {
            l = mid + 1;         
        }
        else {
            r = mid;
            mo = mid;
        }
    }
    cout << mo;

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/02ms1816 KiB
2Elfogadva0/06ms2592 KiB
3Elfogadva3/31ms2000 KiB
4Elfogadva3/31ms2004 KiB
5Elfogadva3/31ms2016 KiB
6Elfogadva3/31ms2028 KiB
7Elfogadva3/31ms2052 KiB
8Elfogadva3/32ms2084 KiB
9Elfogadva3/33ms2300 KiB
10Elfogadva3/34ms2388 KiB
11Elfogadva3/34ms2612 KiB
12Elfogadva3/36ms2848 KiB
13Elfogadva4/47ms2976 KiB
14Elfogadva4/48ms3180 KiB
15Elfogadva4/48ms3316 KiB
16Elfogadva4/410ms3516 KiB
17Elfogadva4/412ms3988 KiB