Submission #1270522

#TimeUsernameProblemLanguageResultExecution timeMemory
1270522goldencheemsSpring cleaning (CEOI20_cleaning)C++20
9 / 100
1096 ms16064 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 17;
int n, q, r, c[N];
int ti, m, in[N], out[N], lg, p[N][21], d[N];
long long z1, z2;
vector <int> adj[N];
vector <pair <int, int>> leaf;
void dfs (int u, int pr)
{
    in[u] = ++ti, p[u][0] = pr, d[u] = d[pr] + 1;
    for (int i = 1; i <= lg; ++i)
    {
        p[u][i] = p[p[u][i - 1]][i - 1];
    }
    for (int v: adj[u])
    {
        if (v != pr)
        {
            dfs (v, u);
        }
    }
    if (adj[u].size() == 1)
    {
        leaf.push_back ({in[u], u});
        ++m;
    }
    out[u] = ti;
}
int lca (int u, int v)
{
    if (d[u] < d[v])
    {
        swap (u, v);
    }
    for (int i = lg; i >= 0; --i)
    {
        if (d[p[u][i]] >= d[v])
        {
            u = p[u][i];
        }
    }
    if (u == v)
    {
        return u;
    }
    for (int i = lg; i >= 0; --i)
    {
        if (p[u][i] != p[v][i])
        {
            u = p[u][i], v = p[v][i];
        }
    }
    return p[u][0];
}
int dist (int u, int v)
{
    return d[u] + d[v] - 2 * d[lca (u, v)];
}
void sub1()
{
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (i != r)
        {
            ++ans;
        }
    }
    while (q--)
    {
        int sz, z = m, _ = ans;
        cin >> sz;
        while (sz--)
        {
            int x;
            cin >> x;
            if (x == r)
            {
                ++z, ++ans;
                continue;
            }
            ++c[x], z += (c[x] > 1);
        }
        for (int i = 1; i <= n; ++i)
        {
            if (c[i] & 1)
            {
                ans += c[i];
            }
            else
            {
                ans += (c[i] > 0) * (c[i] + 1);
            }
            c[i] = 0;
        }
        if (z & 1)
        {
            cout << "-1\n";
        }
        else
        {
            cout << ans << "\n";
        }
        ans = _;
    }
}
void sub2()
{
    while (q--)
    {
        int sz;
        vector <int> vt;
        cin >> sz;
        for (int i = 1, x; i <= sz; ++i)
        {
            cin >> x;
            adj[x].push_back(n + i);
            adj[n + i].push_back(x);
            vt.push_back(x);
        }
        m = ti = 0, lg = __lg(n + sz);
        dfs (r, 0);
        if (m & 1)
        {
            cout << "-1\n";
        }
        else
        {
            sort (leaf.begin(), leaf.end());
            z2 = dist (leaf[0].second, leaf[m - 1].second);
            for (int i = 1; i < m; i += 2)
            {
                z1 += dist (leaf[i].second, leaf[i - 1].second);
            }
            for (int i = 2; i < m - 1; i += 2)
            {
                z2 += dist (leaf[i].second, leaf[i - 1].second);
            }
            cout << min (z1, z2) << "\n";
        }
        leaf.clear();
        for (int x: vt)
        {
            adj[x].pop_back();
        }
        for (int i = 1; i <= sz; ++i)
        {
            adj[n + i].clear();
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> q;
    for (int i = 1, u, v; i < n; ++i)
    {
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 1; i <= n; ++i)
    {
        if (adj[i].size() > 1)
        {
            r = i;
            continue;
        }
        ++m;
    }
    if (m >= n - 1)
    {
        sub1();
        return 0;
    }
    sub2();
}
#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...