Submission #1167012

#TimeUsernameProblemLanguageResultExecution timeMemory
1167012aycnlSpring cleaning (CEOI20_cleaning)C++20
100 / 100
168 ms17796 KiB
#include <bits/stdc++.h>
using namespace std;

#define ii pair <int, int>
#define ff first
#define ss second
#define bit(i) (1 << (i))

#define fto(i, a, b) for (int i = (a); i <= (b); ++i)
#define fdto(i, a, b) for (int i = (a); i >= (b); --i)
#define flto(i, a, b) for (int i = (a); (1 << i) <= (b); ++i)

#define pb push_back
#define pf push_front

#define endl "\n"
#define oo (int)(998244353)
#define maxN 100005

#define l(s) s.length()

#define vi vector <int>
#define vii vector <ii>

#define fat(x, y) for (auto x : y)
#define fit(x, y) for (int x : y)
#define fiit(x, y) for (ii x : y)

#define EPS 1e-9
#define pi (acos(-1))
#define ll long long

int n, q, tme, root;
vi ke[maxN];
int sz[maxN], h[maxN], par[maxN], mark[maxN];
int top[maxN], pos[maxN];
int st[4*maxN], lazy[4*maxN];
int t[maxN];

void down(int id, int l, int r) {
    lazy[id] = 0;
    lazy[id*2] ^= 1;
    lazy[id*2+1] ^= 1;
    int m = (l+r)/2;
    st[id*2] = (m-l+1) - st[id*2];
    st[id*2+1] = (r-m) - st[id*2+1];
}

void ud(int id, int l, int r, int i, int j) {
    if (l > j || r < i) return;
    if (i <= l && r <= j) {
        st[id] = (r-l+1) - st[id];
        lazy[id] ^= 1;
        return;
    }
    if (lazy[id]) down(id, l, r);
    int m = (l+r)/2;
    ud(id*2, l, m, i, j);
    ud(id*2+1, m+1, r, i, j);
    st[id] = st[id*2] + st[id*2+1];
}

void pre_dfs(int u) {
    sz[u] = 1;
    for (int v : ke[u]) if (v != par[u]) {
        par[v] = u;
        h[v] = h[u] + 1;
        pre_dfs(v);
        sz[u] += sz[v];
    }
}

void hld(int u, int tp) {
    top[u] = tp;
    pos[u] = tme++;

    int bigC = 0;
    for (int v : ke[u]) if (v != par[u]) {
        if (sz[v] > sz[bigC]) bigC = v;
    }
    //cout << u << " " << bigC << endl;

    if (bigC) hld(bigC, tp);
    for (int v : ke[u]) if (v != par[u]) {
        if (v != bigC) hld(v, v);
    }
}

void treeud(int u) {
    while (1) {
        if (top[u] == root) {
            if (u != root) ud(1, 1, n-1, 1, pos[u]);
            break;
        }
        ud(1, 1, n-1, pos[top[u]], pos[u]);
        //ud(1, 1, n-1, pos[top[u]], pos[top[u]]);
        u = par[top[u]];
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    cin >> n >> q;
    fto(i, 1, n-1) {
        int u, v; cin >> u >> v;
        ke[u].pb(v);
        ke[v].pb(u);
    }
    fto(i, 1, n) if (ke[i].size() != 1) {
        root = i;
        break;
    }
    //cout << root << endl;
    pre_dfs(root);
    hld(root, root);
    //return 0;

    int cr = 0;
    fto(i, 1, n) if (int(ke[i].size()) == 1) {
        ++cr;
        treeud(i);
    }
    //cout << st[1] << endl;

    while (q--) {
        int d; cin >> d;
        unordered_map<int, int> mp;
        int cur = cr;
        fto(i, 1, d) cin >> t[i];

        fto(i, 1, d) {
            cur++;
            if (ke[t[i]].size() > 1 || mp.count(t[i])) treeud(t[i]);
            else --cur;
            mp[t[i]] = 1;
        }

        //cout << cur << endl;
        if (cur%2 == 0) cout << 2*n - 2 - st[1] + d << endl;
        else cout << -1 << endl;

        mp.clear();
        fto(i, 1, d) {
            if (ke[t[i]].size() > 1 || mp.count(t[i])) treeud(t[i]);
            mp[t[i]] = 1;
        }
    }

    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...