Submission #1293867

#TimeUsernameProblemLanguageResultExecution timeMemory
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...