제출 #1293865

#제출 시각아이디문제언어결과실행 시간메모리
1293865saidshikhovPaprike (COI18_paprike)C++20
13 / 100
75 ms14500 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<vector<int>> graph; vector<int> h; vector<int> subtree_sum; int n, k; int cuts = 0; void dfs(int node, int parent) { subtree_sum[node] = h[node]; for (int neighbor : graph[node]) { if (neighbor == parent) continue; dfs(neighbor, node); // Если поддерево соседа уже отрезано (сумма = 0), пропускаем if (subtree_sum[neighbor] == 0) continue; // Проверяем, нужно ли делать разрез if (subtree_sum[node] + subtree_sum[neighbor] > k) { cuts++; } else { subtree_sum[node] += subtree_sum[neighbor]; } } // Если текущая вершина сама превышает k, это невозможно - ошибка в данных // Но по условию каждый перец имеет неотрицательную остроту и k >= 0 // Значит, каждый отдельный перец всегда ≤ k } int main() { cin >> n >> k; h.resize(n); subtree_sum.resize(n); graph.resize(n); // Читаем остроты перцев for (int i = 0; i < n; i++) { cin >> h[i]; // Проверяем, что острота каждого перца ≤ k if (h[i] > k) { // Это невозможно по условию, но на всякий случай cout << -1 << endl; return 0; } } // Строим дерево 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...