답안 #1002388

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1002388 2024-06-19T14:00:26 Z yoav_s Spring cleaning (CEOI20_cleaning) C++17
53 / 100
1000 ms 45148 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")

using namespace std;

typedef int ll;
typedef vector<ll> v;
typedef vector<v> vv;
typedef vector<vv> vvv;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<vvb> vvvb;
typedef pair<ll,ll> p;
typedef vector<p> vp;
typedef vector<vp> vvp;
typedef vector<vvp> vvvp;
typedef pair<ll, p> tri;
typedef vector<tri> vtri;
typedef vector<vtri> vvtri;
typedef vector<vvtri> vvvtri;

#define f first
#define s second
#define pb push_back
#define eb emplace_back
#define all(v) (v).begin(),(v).end()

const ll INF = 1e18;
const ll mod = 1e9 + 7;
#define set unordered_set

ll getLeafCount(ll i, vv &graph, v &res)
{
    if (res[i] != -1) return 0;
    res[i] = 0;
    if (graph[i].size() == 1)
    {
        res[i] = 1;
        return 1;
    }
    for (ll x : graph[i]) res[i] += getLeafCount(x, graph, res);
    return res[i];
}

void getOddAndEvenParents(ll i, vv &graph, v &oddRes, v &evenRes, ll oddParents, ll evenParents, v &parity)
{
    if (oddRes[i] != -1) return;
    if (parity[i] % 2 == 0) evenParents++;
    else oddParents++;
    oddRes[i] = oddParents;
    evenRes[i] = evenParents;
    for (ll x : graph[i]) getOddAndEvenParents(x, graph, oddRes, evenRes, oddParents, evenParents, parity);
}

set<ll> solve(ll i, vv &graph, vb &visited, v &res, vv &changes, v &oddParents, v &evenParents)
{
    visited[i] = true;
    vector<set<ll>> childrenSets;
    for (ll x : graph[i])
    {
        if (visited[x]) continue;
        childrenSets.pb(solve(x, graph, visited, res, changes, oddParents, evenParents));
    }
    childrenSets.pb(set<ll>());
    for (ll x : changes[i])
    {
        childrenSets.back().insert(x);
        res[x] += oddParents[i] - evenParents[i];
    }
    sort(all(childrenSets),[](set<ll> &a, set<ll> &b){return a.size() < b.size();});
    set<ll> baseSet;
    if (childrenSets.size() > 0)
    {
        baseSet = childrenSets.back();
        childrenSets.pop_back();
    }
    set<ll> newAdditions;
    for (auto &x : childrenSets)
    {
        for (auto y : x)
        {
            if (baseSet.count(y) > 0)
            {
                res[y] -= oddParents[i] - evenParents[i];
            }
            else
            {
                baseSet.insert(y);
                newAdditions.insert(y);
            }
        }
    }
    for (ll x : newAdditions) baseSet.erase(x);
    set<ll> done;
    for (auto &x : childrenSets)
    {
        for (auto y : x)
        {
            if (baseSet.count(y) > 0)
            {
                baseSet.erase(y);
                done.insert(y);
                res[y] += evenParents[i] - oddParents[i];
            }
            else
            {
                baseSet.insert(y);
                if (done.count(y) > 0)
                    res[y] += oddParents[i] - evenParents[i];
            }
        }
    }
    return baseSet;
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    ll N, Q;
    cin >> N >> Q;
    vv graph(N);
    for (ll i = 0; i < N - 1; i++)
    {
        ll a, b;
        cin >> a >> b; a--; b--;
        graph[a].pb(b);
        graph[b].pb(a);
    }
    ll root = 0;
    while (graph[root].size() == 1) root++;
    v leafCount(N, -1);
    getLeafCount(root, graph, leafCount);
    v oddParents(N, -1), evenParents(N, -1);
    getOddAndEvenParents(root, graph, oddParents, evenParents, 0, 0, leafCount);
    vv queries(Q);
    for (ll i = 0; i < Q; i++)
    {
        ll amt;
        cin >> amt;
        for (ll j=  0; j < amt; j++)
        {
            ll par;
            cin >> par;
            par--;
            queries[i].pb(par);
        }
    }
    vv changedInQueries(N);
    for (ll i = 0 ;i < Q; i++)
    {
        map<ll, ll> changed;
        
        for (ll x : queries[i])
        {
            changed[x]++;
        }
        for (auto x : changed)
        {
            if ((x.s % 2 == 1) ^ (graph[x.f].size() == 1)) changedInQueries[x.f].pb(i);
        }
    }
    v addToQuery(Q);
    ll base = N - 2;
    for (ll i = 0 ;i < N; i++) if (leafCount[i] % 2 == 0) base++;
    vb visited(N, false);
    solve(root, graph, visited, addToQuery, changedInQueries, oddParents, evenParents);
    for (ll i = 0; i < Q; i++)
    {
        ll count = leafCount[root] + queries[i].size();
        set<ll> changed;
        for (ll x : queries[i]) if (graph[x].size() == 1) changed.insert(x);
        count -= changed.size();
        if (count % 2 == 1) cout << "-1\n";
        else cout << base + queries[i].size() + addToQuery[i] << "\n";
    }
    return 0;
}

Compilation message

cleaning.cpp:28:16: warning: overflow in conversion from 'double' to 'll' {aka 'int'} changes value from '1.0e+18' to '2147483647' [-Woverflow]
   28 | const ll INF = 1e18;
      |                ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 53 ms 3952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 1492 KB Output is correct
2 Correct 11 ms 1476 KB Output is correct
3 Correct 41 ms 17280 KB Output is correct
4 Correct 69 ms 17344 KB Output is correct
5 Correct 78 ms 20548 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 3284 KB Output is correct
2 Correct 14 ms 3112 KB Output is correct
3 Correct 57 ms 45148 KB Output is correct
4 Correct 94 ms 45000 KB Output is correct
5 Correct 54 ms 40788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 85 ms 7512 KB Output is correct
2 Correct 22 ms 2648 KB Output is correct
3 Correct 8 ms 2140 KB Output is correct
4 Correct 30 ms 4928 KB Output is correct
5 Correct 52 ms 5928 KB Output is correct
6 Correct 88 ms 5456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 13960 KB Output is correct
2 Correct 90 ms 8272 KB Output is correct
3 Correct 70 ms 5068 KB Output is correct
4 Correct 100 ms 8532 KB Output is correct
5 Correct 90 ms 8472 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 21460 KB Output is correct
2 Execution timed out 1076 ms 31232 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 53 ms 3952 KB Output is correct
3 Correct 11 ms 1492 KB Output is correct
4 Correct 11 ms 1476 KB Output is correct
5 Correct 41 ms 17280 KB Output is correct
6 Correct 69 ms 17344 KB Output is correct
7 Correct 78 ms 20548 KB Output is correct
8 Correct 14 ms 3284 KB Output is correct
9 Correct 14 ms 3112 KB Output is correct
10 Correct 57 ms 45148 KB Output is correct
11 Correct 94 ms 45000 KB Output is correct
12 Correct 54 ms 40788 KB Output is correct
13 Correct 85 ms 7512 KB Output is correct
14 Correct 22 ms 2648 KB Output is correct
15 Correct 8 ms 2140 KB Output is correct
16 Correct 30 ms 4928 KB Output is correct
17 Correct 52 ms 5928 KB Output is correct
18 Correct 88 ms 5456 KB Output is correct
19 Correct 132 ms 13960 KB Output is correct
20 Correct 90 ms 8272 KB Output is correct
21 Correct 70 ms 5068 KB Output is correct
22 Correct 100 ms 8532 KB Output is correct
23 Correct 90 ms 8472 KB Output is correct
24 Correct 174 ms 21460 KB Output is correct
25 Execution timed out 1076 ms 31232 KB Time limit exceeded
26 Halted 0 ms 0 KB -