Submission #1278118

#TimeUsernameProblemLanguageResultExecution timeMemory
1278118julsjlvTree (IOI24_tree)C++20
18 / 100
67 ms26100 KiB
#include "tree.h"
#include <stdio.h>
#include <map>
#define lol long long

using namespace std;

int n;
std::vector<int> p, w;
std::vector<vector<lol> > children;
map<lol, lol> counts;
lol zeroes;

// return countLeaves
lol dfs(lol node)
{
  lol leaves = 0;
  if (w[node] == 0) {
    for (auto j: children[node]) {
      lol result = dfs(j);
      counts[result]++;
    }
    return 1;
  }
  for (auto j: children[node])
    leaves += dfs(j);
  return (children[node].size() == 0) ? 1 : leaves;
}

void init(std::vector<int> P, std::vector<int> W) {
  p = P;
  w = W;
  n = (int)p.size();
  counts.clear();
  children.clear();
  children = vector<vector<lol> >(p.size(), vector<lol>());
  for (int i = 0; i < n; i++) {
    if (p[i] != -1)
      children[p[i]].push_back(i);
    zeroes += w[i] == 0;
  }
  
  lol leavesOfRoot = dfs(0);
  counts[leavesOfRoot]++;
}

long long subtree(lol L, lol R, lol leavesCount) {
  
  lol sumLeaves = leavesCount * ((lol) L);
  if (sumLeaves <= R) {
    return sumLeaves;
  } else {
    return sumLeaves + (sumLeaves - R);
  }
}

long long query(int L, int R) {
  long long result = 0;
  for (auto j: counts)
    result += subtree(L, R, j.first) * j.second;
  return result - zeroes * L;
}

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