Submission #1217131

#TimeUsernameProblemLanguageResultExecution timeMemory
1217131anonymous321Spring cleaning (CEOI20_cleaning)C++20
28 / 100
1095 ms16924 KiB
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> adj_list;

vector<int> p;
vector<int> dp;
vector<int> dpl;
vector<bool> leaf;
vector<bool> e;

int sol;

void dfs (int v) {
    dp[v] = 0;
    dpl[v] = 0;
    int cnt = 0;
    for (auto &it : adj_list[v]) {
        if (it == p[v]) continue;
        cnt++;
        p[it] = v;
        dfs(it);
        dpl[v] += dpl[it];
        dp[v] += 2 - (dpl[it] % 2);
        dp[v] += dp[it];
    }
    if (cnt == 0) dpl[v]++;
    if (cnt == 1 && p[v] == -1) dpl[v]++;
    leaf[v] = cnt == 0;
    e[v] = dpl[v] % 2;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    adj_list = vector<vector<int>> (n);
    for (int i = 0; i < n-1; i++) {
        int u, v;
        cin >> u >> v;
        adj_list[u-1].push_back(v-1);
        adj_list[v-1].push_back(u-1);
    }
    
    vector<vector<int>> va (q);
    for (int i = 0; i < q; i++) {
        int d;
        cin >> d;
        for (int j = 0; j < d; j++) {
            int a;
            cin >> a;
            va[i].push_back(a-1);
        }
    }

    p = vector<int> (n, -1);
    dp = vector<int> (n, 0);
    dpl = vector<int> (n, 0);
    e = vector<bool> (n, false);
    leaf = vector<bool> (n, false);
    vector<int> nleafs (n, 0);
    dfs(0);
    sol = dp[0];
    int leafs = dpl[0];

    for (int i = 0; i < q; i++) {
        for (auto &it : va[i]) {
            int cur = it;
            bool nl = !leaf[it] || nleafs[it] > 0;
            nleafs[it]++;
            if (!nl) {
                continue;
            }
            while (cur != -1) {
                dpl[cur]++;
                if (cur != 0) {
                    if (e[cur]) sol++;
                    else sol--;
                    e[cur] = !e[cur];
                }
                cur = p[cur];
            }
        }

        if (dpl[0] % 2 == 1) cout << "-1\n";
        else cout << sol + va[i].size() << "\n";

        for (auto &it : va[i]) {
            int cur = it;
            bool nl = !leaf[it] || nleafs[it] > 1;
            nleafs[it]--;
            if (!nl) {
                continue;
            }
            while (cur != -1) {
                dpl[cur]--;
                if (cur != 0) {
                    if (e[cur]) sol++;
                    else sol--;
                    e[cur] = !e[cur];
                }
                cur = p[cur];
            }
        }
    }

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...