제출 #1278118

#제출 시각아이디문제언어결과실행 시간메모리
1278118julsjlv트리 (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...