Submission #558072

# Submission time Handle Problem Language Result Execution time Memory
558072 2022-05-06T16:54:31 Z status_coding Spring cleaning (CEOI20_cleaning) C++14
18 / 100
1000 ms 15040 KB
#include <bits/stdc++.h>

using namespace std;

int n,q,sz,root;
int cntEven;

int nrLeaf[100005];
int aux[100005];

int parV[100005];
vector<int> v[100005];

vector<int> upd;

void dfs(int p, int par)
{
    parV[p] = par;

    nrLeaf[p] = 0;

    for(int it : v[p])
    {
        if(it == par)
            continue;

        dfs(it, p);
        nrLeaf[p] += nrLeaf[it];
    }

    nrLeaf[p] += aux[p];

    if(!nrLeaf[p])
        nrLeaf[p] = 1;

    if(nrLeaf[p] % 2 == 0)
        cntEven++;
}

void solveBig(int k, vector<int> &upd)
{
    for(int it : upd)
        aux[it] ++;

    cntEven=0;
    dfs(root, 0);

    if(nrLeaf[root] % 2)
        cout<<"-1\n";
    else
        cout<<n+k-1 + cntEven-1<<'\n';

    for(int i=1; i<=n; i++)
        aux[i] = 0;

    cntEven=0;
    dfs(root, 0);
}

void add(int p)
{
    if((int)v[p].size() == 1)
        return;

    while(p)
    {
        nrLeaf[p]++;

        if(nrLeaf[p] % 2 == 0)
            cntEven++;
        else
            cntEven--;

        p = parV[p];
    }

}

void del(int p)
{
    if((int)v[p].size() == 1)
        return;

    while(p)
    {
        nrLeaf[p]--;

        if(nrLeaf[p] % 2 == 0)
            cntEven++;
        else
            cntEven--;

        p = parV[p];
    }
}

void solveSmall(int k, vector<int> &upd)
{
    for(int it : upd)
        add(it);

    if(nrLeaf[root] % 2)
        cout<<"-1\n";
    else
        cout<<n+k-1 + cntEven-1<<'\n';

    for(int it : upd)
        del(it);
}

int main()
{
    cin>>n>>q;
    sz = sqrt((int)1e5);
    //sz=0;
    //sz = 1e9;

    for(int i=1; i<n; i++)
    {
        int x, y;
        cin>>x>>y;

        v[x].push_back(y);
        v[y].push_back(x);
    }

    for(int i=1; i<=n; i++)
        if((int)v[i].size() >= 2)
            root = i;

    cntEven=0;
    dfs(root, 0);

    while(q)
    {
        q--;

        upd.clear();

        int k;
        cin>>k;

        for(int i=1; i<=k; i++)
        {
            int x;
            cin>>x;

            upd.push_back(x);
        }

        if(k >= sz)
            solveBig(k, upd);
        else
            solveSmall(k, upd);
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 73 ms 3708 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 22 ms 3440 KB Output is correct
2 Correct 24 ms 3708 KB Output is correct
3 Correct 57 ms 7744 KB Output is correct
4 Correct 85 ms 6704 KB Output is correct
5 Correct 87 ms 8256 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 30 ms 3844 KB Output is correct
2 Correct 31 ms 4232 KB Output is correct
3 Correct 97 ms 15040 KB Output is correct
4 Correct 113 ms 14412 KB Output is correct
5 Correct 111 ms 13588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 445 ms 3924 KB Output is correct
2 Incorrect 37 ms 3916 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 176 ms 5452 KB Output is correct
2 Incorrect 174 ms 5648 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 272 ms 7308 KB Output is correct
2 Execution timed out 1091 ms 9620 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 73 ms 3708 KB Output isn't correct
3 Halted 0 ms 0 KB -