Submission #1216418

#TimeUsernameProblemLanguageResultExecution timeMemory
1216418hengliaoTree (IOI24_tree)C++20
10 / 100
2096 ms30312 KiB
#include "tree.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pll pair<ll, ll>
#define vll vector<ll>
#define pb push_back

typedef long long ll;

namespace{

    const ll mxN=2e5+5;

    ll n, l, r;
    ll sum[mxN];
    multiset<pll> st[mxN];
    ll ans;
    ll p[mxN];
    vll adj[mxN];
    ll w[mxN];
    ll leafcnt;
    ll f, s;

    void dfs(ll cur){
        if(adj[cur].empty()){
            sum[cur]=l;
            ans+=w[cur]*l;
            return;
        }
        sum[cur]=0;
        for(auto &chd:adj[cur]){
            dfs(chd);
            sum[cur]+=sum[chd];
        }
        if(sum[cur]>r) ans+=(sum[cur]-r)*w[cur];
        sum[cur]=min(sum[cur], r);
    }
}

void init(std::vector<int> P, std::vector<int> W) {
    n=W.size();
    for(ll i=1;i<n;i++){
        p[i]=P[i];
        adj[p[i]].pb(i);
    }
    for(ll i=0;i<n;i++){
        w[i]=W[i];
    }
//     leafcnt=0;
//     for(ll i=0;i<n;i++){
//         if(adj[i].empty()){
//             f+=w[i];
//         }
//     }
//     for(ll i=0;i<n;i++){
//         if(!adj[i].empty()){
//             s+=w[i]*((ll) adj[i].size()-1);
//         }
//     }
}

long long query(int L, int R) {
    l=L;
    r=R;
    ans=0;
    dfs(0);
    return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...