| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1276967 | SnowRaven52 | Biochips (IZhO12_biochips) | C++20 | 2 ms | 576 KiB | 
#include <bits/stdc++.h>
using namespace std;
struct Res { double val; int cnt; };
int n, m;
vector<int> w, par;
vector<vector<int>> g;
double lam;
Res dfs(int v){
    double take = w[v] - lam;
    int cntT = 1;
    double skip = 0.0; int cntS = 0;
    for(int u : g[v]){
        Res r = dfs(u);
        skip += r.val;
        cntS += r.cnt;
    }
    if(take > skip) return {take, cntT};
    return {skip, cntS};
}
pair<double,int> solve(double L){
    lam = L;
    double val = 0.0; int cnt = 0;
    for(int i = 1; i <= n; i++) if(par[i] == 0){
        Res r = dfs(i);
        val += r.val; cnt += r.cnt;
    }
    return {val, cnt};
}
int main(){
    freopen("d.in", "r", stdin);
	  freopen("d.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    w.assign(n + 1, 0);
    par.assign(n + 1, 0);
    for(int i = 1; i <= n; i++) cin >> w[i];
    for(int i = 1; i <= n; i++) cin >> par[i];
    g.assign(n + 1, {});
    for(int i = 1; i <= n; i++) if(par[i] != 0) g[par[i]].push_back(i);
    double lo = -1e4, hi = 1e4;
    for(int it = 0; it < 70; it++){
        double mid = (lo + hi) * 0.5;
        auto [val, cnt] = solve(mid);
        if(cnt >= m) lo = mid; else hi = mid;
    }
    auto [val, cnt] = solve(lo);
    long long ans = llround(val + lo * m);
    cout << ans << endl;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
