Submission #1228010

#TimeUsernameProblemLanguageResultExecution timeMemory
1228010Mousa_AboubakerTree (IOI24_tree)C++20
0 / 100
2097 ms59188 KiB
#include "tree.h"
#include <bits/stdc++.h>
using namespace std;

template <typename T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

#define SZ(x) (int)x.size()

int n;
vector<int> p, w;
vector<vector<int>> adj;

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

long long query(int L, int R)
{
  long long res = 0;
  vector<long long> cnt(n, 0);
  auto dfs = [&](auto self, int u) -> pair<long long, pqg<tuple<int, long long, int>>>
  {
    if((int)adj[u].size() == 0)
    {
      pqg<tuple<int, long long, int>> x;
      x.push({w[u], L, u});
      cnt[u] += L;
      return make_pair(L, x);
    }
    else
    {
      long long sum = 0;
      pqg<tuple<int, long long, int>> pq;
      for(auto i: adj[u])
      {
        auto x = self(self, i);
        sum += x.first;
        if(SZ(x.second) > SZ(pq))
          swap(x.second, pq);
        while(not x.second.empty())
        {
          pq.push(x.second.top());
          x.second.pop();
        }
      }
      long long curr = max(0ll, sum - R);
      cnt[u] -= curr;
      sum -= curr;
      while(!pq.empty())
      {
        auto [ww, vv, ii] = pq.top();
        if(vv == L)
        {
          pq.pop();
          continue;
        }
        if(ww >= w[u])
          break;
        if(curr == 0)
          break;
        long long mn = min({curr, vv - L});
        curr -= mn;
        cnt[u] += mn;
        cnt[ii] -= mn;
        pq.pop();
        pq.push({ww, vv - mn, ii});
      }
      pq.push({w[u], sum, u});
      return make_pair(sum, pq);
    }
  };
  dfs(dfs, 0);
  for(int i = 0; i < n; i++)
    res += llabs(cnt[i]) * 1ll * w[i];

  return res;
}
#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...