제출 #1293867

#제출 시각아이디문제언어결과실행 시간메모리
1293867saidshikhovPaprike (COI18_paprike)C++20
13 / 100
86 ms10968 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<vector<int>> graph; vector<int> h; int n, k; int cuts = 0; // DFS возвращает сумму в поддереве, или 0 если поддерево было отрезано int dfs(int node, int parent) { int current_sum = h[node]; for (int neighbor : graph[node]) { if (neighbor == parent) continue; int child_sum = dfs(neighbor, node); // Если можем безопасно добавить поддерево ребенка if (current_sum + child_sum <= k) { current_sum += child_sum; } else { // Иначе - делаем разрез cuts++; } } // Если текущая вершина сама превышает k - это невозможно по условию // но если вдруг, то это ошибка в данных return current_sum; } int main() { cin >> n >> k; h.resize(n); graph.resize(n); // Читаем остроты перцев for (int i = 0; i < n; i++) { cin >> h[i]; } // Строим дерево for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; u--; v--; graph[u].push_back(v); graph[v].push_back(u); } dfs(0, -1); cout << cuts << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...