Submission #1293865

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