답안 #558071

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558071 2022-05-06T16:53:48 Z status_coding Spring cleaning (CEOI20_cleaning) C++14
0 / 100
1000 ms 10928 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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 70 ms 4220 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 24 ms 3744 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1084 ms 4244 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1084 ms 4300 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 6120 KB Output is correct
2 Incorrect 107 ms 6528 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 307 ms 7972 KB Output is correct
2 Execution timed out 1085 ms 10928 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 70 ms 4220 KB Output isn't correct
3 Halted 0 ms 0 KB -