Submission #1151138

#TimeUsernameProblemLanguageResultExecution timeMemory
1151138ZicrusTree (IOI24_tree)C++20
18 / 100
70 ms28128 KiB
#include <bits/stdc++.h> #include "tree.h" using namespace std; typedef long long ll; int n; vector<int> p, w; vector<vector<ll>> adj; map<ll, ll> leaves; // leaf count, tree count ll zeroCnt = 0; ll dfs(ll cur) { if (w[cur] == 0 && p[cur] >= 0 && w[p[cur]] == 1) zeroCnt++; ll leafCnt = 0; for (auto &e : adj[cur]) { leafCnt += dfs(e); } if (w[cur] == 1 && (p[cur] == -1 || w[p[cur]] == 0)) { leaves[max(1ll, w[cur] ? leafCnt : 1)]++; } return max(1ll, w[cur] ? leafCnt : 1); } void init(vector<int> P, vector<int> W) { p = P; w = W; n = (int)p.size(); adj = vector<vector<ll>>(n); zeroCnt = 0; for (int i = 1; i < n; i++) { adj[p[i]].push_back(i); } dfs(0); } ll query(int L, int R) { ll result = -zeroCnt * L; for (auto &[leafCnt, c] : leaves) { ll leafStuff = leafCnt * L; if (leafStuff > R) { result += c * (2 * leafStuff - R); } else { result += c * leafStuff; } } return result; } #ifdef TEST #include "grader.cpp" #endif
#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...