Submission #637245

#TimeUsernameProblemLanguageResultExecution timeMemory
637245tvladm2009Norela (info1cup18_norela)C++14
100 / 100
141 ms197272 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long long ld;

const int MAX_N = 60;
const int MAX_M = 24;

ll spells[MAX_N + 1], cards[1ll << MAX_M];
int lg2[1 << MAX_M];
vector<int> mn;

int n, m;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int q;
        cin >> q;
        while (q--) {
            int x;
            cin >> x;
            x--;
            spells[i] |= (1ll << x);
        }
    }

    for (int i = 2; i < (1ll << m); i++) {
        lg2[i] = lg2[i >> 1] + 1;
    }
    for (int mask = 1; mask < (1 << m); mask++) {
        int bit = lg2[(mask & -mask)];
        cards[mask] = (cards[mask ^ (1ll << bit)] ^ spells[bit + 1]);
    }
    int answer = (1 << 30);
    for (int mask = 0; mask < (1 << m); mask++) {
        if (cards[mask] == (1ll << n) - 1) {
            answer = min(answer, __builtin_popcountll(mask));
        }
    }

    cout << answer << "\n";
    for (int mask = 0; mask < (1 << m); mask++) {
        if (cards[mask] == (1ll << n) - 1 && __builtin_popcountll(mask) == answer) {
            vector<int> used;
            for (int bit = 0; bit < m; bit++) {
                if (mask & (1 << bit)) {
                    used.push_back(bit + 1);
                }
            }
            if (mn.size() == 0 || used < mn) {
                mn = used;
            }
        }
    }
    for (int it : mn) {
        cout << it << " ";
    }

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