Submission #1188000

#TimeUsernameProblemLanguageResultExecution timeMemory
1188000nikdTree (IOI24_tree)C++20
0 / 100
2096 ms50088 KiB
#include "tree.h"
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

int n;
vector<vector<int>> adj;
vector<ll> w;

void init(std::vector<int> P, std::vector<int> W) {
  n = P.size();
  adj.resize(n);
  w.resize(n);
  for(int i = 0; i<n; i++) w[i] = W[i];
  for(int i = 1; i<n; i++) adj[P[i]].push_back(i);
}

long long query(int L, int R) {
  ll r = R; ll l = L;
  ll sol = 0;
  vector<int> sz(n, 0);
  function<map<ll, ll>(int)> dfs = [&](int v)->map<ll, ll>{
    map<ll, ll> mp;
    if(!adj[v].size()){
        sol += w[v]*l;
        sz[v] = l;
        return mp;
    }
    for(int u: adj[v]){
        auto tmp =  dfs(u);
        sz[v] += sz[u];
        if(tmp.size() > mp.size()) swap(mp, tmp);
        for(auto [k, vaal]: tmp){
            mp[k] += vaal;
        }
    }
    if(sz[v] <= r){
        if(sz[v]-l > 0) mp[w[v]] += sz[v]-l;
        return mp;
    }
    for(auto& [k, val]: mp){
        if(k >= w[v]) break;
        ll vl = min(sz[v]-r, val);
        sz[v] -= vl;
        sol += vl*k;
        if(vl == val) mp.erase(k);
        else mp[k] -= vl;
        if(sz[v] <= r)  break;
    }
    ll vl = sz[v]-r;
    sz[v] -= vl;
    sol += vl*w[v];
    if(r>l) mp[w[v]] += r-l;
    return mp;
  };
  dfs(0);
  return sol;
}

#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...