Submission #702333

#TimeUsernameProblemLanguageResultExecution timeMemory
702333CyanmondSpring cleaning (CEOI20_cleaning)C++17
34 / 100
1088 ms20732 KiB
#include <bits/stdc++.h>

using i64 = long long;

int main() {
    int N, Q;
    std::cin >> N >> Q;
    std::vector<int> A(N - 1), B(N - 1);
    std::vector<std::vector<int>> baseTree(N);
    for (int i = 0; i < N - 1; ++i) {
        std::cin >> A[i] >> B[i];
        --A[i], --B[i];
        baseTree[A[i]].push_back(B[i]);
        baseTree[B[i]].push_back(A[i]);
    }
    std::vector<int> D(Q);
    std::vector<std::vector<int>> L(Q);
    for (int i = 0; i < Q; ++i) {
        std::cin >> D[i];
        L[i].resize(D[i]);
        for (int &e : L[i]) {
            std::cin >> e;
            --e;
        }
    }
    std::vector<int> degree(N);
    for (int i = 0; i < N; ++i) {
        degree[i] = (int)baseTree[i].size();
    }
    const int nonLeafV = (std::max_element(degree.begin(), degree.end()) - degree.begin());

    for (int q = 0; q < Q; ++q) {
        std::vector<std::vector<int>> tree = baseTree;
        for (int i = 0; i < D[q]; ++i) {
            const int v = L[q][i];
            tree.push_back(std::vector<int>());
            tree[N + i].push_back(v);
            tree[v].push_back(N + i);
        }

        auto dfs = [&](auto &&self, const int v, const int p) -> std::pair<i64, int> {
            i64 ret = 0;
            int cnt = 0;
            if (tree[v].size() == 1) {
                ret = 0;
                cnt = 1;
                return {ret, cnt};
            }
            for (const int t : tree[v]) {
                if (p == t) {
                    continue;
                }
                const auto [cval, c] = self(self, t, v);
                assert(1 <= c and c <= 2);
                cnt += c;
                ret += cval + c;
            }
            cnt %= 2;
            if (cnt == 0) {
                cnt += 2;
            }
            if (cnt == 1 and v == nonLeafV) {
                ret = -1;
            }
            return {ret, cnt};
        };
        std::cout << dfs(dfs, nonLeafV, -1).first << std::endl;
    }
}
#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...