Submission #1284671

#TimeUsernameProblemLanguageResultExecution timeMemory
1284671julsjlv트리 (IOI24_tree)C++20
28 / 100
2095 ms27128 KiB
#include "tree.h" #include <stdio.h> #include <map> #include <set> #include <queue> #define lol long long using namespace std; int n; vector<int> p, w; vector<vector<lol> > children; map<lol, lol> counts; lol zeroes; // mode == 0: W <= 1 // mode == 1: W[P[i]] <= W[i] for each 1 <= i <= N lol mode; vector<int> initialGrades; // 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(vector<int> P, vector<int> W) { p = P; w = W; n = (int)p.size(); counts.clear(); children.clear(); mode = 0; for (auto j: W) { if (j != 0 && j != 1) { mode = 1; break; } } 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]++; initialGrades = vector<int>(p.size(), 0); for (int i = 0; i < n; i++) { if (p[i] == -1) continue; initialGrades[p[i]]++; } } lol 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) { lol result = 0; if (mode == 0) { for (auto j: counts) result += subtree(L, R, j.first) * j.second; return result - zeroes * L; } else if (mode == 1) { vector<int> currentGrades = vector<int>(n, 0); vector<lol> currentValues = vector<lol>(n, 0); queue<int> q; for (int i = 0; i < n; i++) { currentGrades[i] = initialGrades[i]; if (currentGrades[i] == 0) q.push(i); } while (!q.empty()) { int i = q.front(); q.pop(); if (currentValues[i] < L) { result += w[i] * (L - currentValues[i]); currentValues[i] = L; } else if (currentValues[i] > R) { result += w[i] * (currentValues[i] - R); currentValues[i] = R; } if (i == 0) continue; currentValues[p[i]] += currentValues[i]; currentGrades[p[i]]--; if (currentGrades[p[i]] == 0) q.push(p[i]); } return result; } return -1; }
#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...