This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/**
 * Uždavinio "Balandžio pirma" sprendimas.
 *
 * Perrinksime visas galimas faktų aibes, kurių iš viso yra 2^20 ~= 1000000.
 * Parinkę kiekvieną aibę, patikrinsime šias sąlygas:
 *
 * - Kiekvienas faktas yra paskelbtas bent vieno dienraščio.
 * - Kiekvienas dienraštis yra paskelbęs lygiai vieną neteisingą faktą.
 *
 * Šis sprendimas naudoja bitų aritmetiką aibių operacijoms.
 */
#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int MAX_N = 1000;
const int MAX_F = 6;
// Globalūs uždavinio kintamieji:
// - kiekvieno dienraščio paskelbti faktai, bei
// - visi paskelbti faktai.
vector<int> faktai(MAX_N);
int visi_faktai;
int bituSkaicius(int a) {
    int skaicius = 0;
    while (a > 0) {
        skaicius += (a & 1);
        a >>= 1;
    }
    return skaicius;
}
void patikrink(int parinkti_faktai,
               int N,
               int* min_faktu,
               int* max_faktu) {
    // Kiekvienas faktas yra paskelbtas bent vieno dienraščio:
    if ((parinkti_faktai & visi_faktai) != parinkti_faktai) {
        return;
    }
    // Kiekvienas dienraštis yra paskelbęs lygiai vieną neteisingą faktą.
    for (int i = 0; i < N; i++) {
        if (bituSkaicius(parinkti_faktai & faktai[i]) != 1) {
            return;
        }
    }
    // Rinkinys yra teisingas, atnaujiname parinktą atsakymą.
    int kiek_faktu = bituSkaicius(parinkti_faktai);
    if (*min_faktu > kiek_faktu) *min_faktu = kiek_faktu;
    if (*max_faktu < kiek_faktu) *max_faktu = kiek_faktu;
}
void perrink(int parinkti_faktai,
             int i,
             int N,
             int F,
             int* min_faktu,
             int* max_faktu) {
    if (i > F) {
        patikrink(parinkti_faktai, N, min_faktu, max_faktu);
    } else {
        parinkti_faktai ^= 1 << i;
        perrink(parinkti_faktai, i + 1, N, F, min_faktu, max_faktu);
        parinkti_faktai ^= 1 << i;
        perrink(parinkti_faktai, i + 1, N, F, min_faktu, max_faktu);
    }
}
int main() {
    int N; cin >> N;
    int F; cin >> F;
    for (int i = 0; i < N; i++) {
        int k; cin >> k;
        for (int j = 0; j < k; j++) {
            int f; cin >> f;
            faktai[i] |= 1 << f;
            visi_faktai |= 1 << f;
        }
    }
    int min_faktu = N + 1, max_faktu = 0;
    perrink(0, 1, N, F, &min_faktu, &max_faktu);
    cout << min_faktu << " " << max_faktu << endl;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |