#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<int> > children;
map<int, int> counts;
// return countLeaves
int dfs(int node)
{
int leaves = 0;
if (w[node] == 0) {
for (auto j: children[node])
counts[dfs(j)]++;
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<int> >(p.size(), vector<int>());
for (int i = 0; i < n; i++)
if (p[i] != -1)
children[p[i]].push_back(i);
int leavesOfRoot = dfs(0);
counts[leavesOfRoot]++;
}
long long subtree(int L, int R, int 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;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |