quarta-feira, 24 de outubro de 2018

URI PROBLEMA 2222 - Brincando com Conjuntos SOLUÇÃO EM C

URI Online Judge | 2222

Brincando com Conjuntos

Por Gabriel Duarte, UNIFESO BR Brazil
Timelimit: 1
Dabriel é um menino fissurado por matemática, ele acaba de aprender em sua escola operações sobre conjuntos.
Após passar a tarde toda brincando com alguns conjuntos que ele possui, chega a hora de resolver as lições de casa, porém ele já está muito cansado e com medo de que possa cometer alguns erros, solicitou sua ajuda.
Dabriel deseja um programa de computador que dado N conjuntos e os elementos de cada conjunto, ele possa realizar algumas operações, são elas:
1 X Y: Retorna a quantidade de elementos distintos da intersecção entre o conjunto X com o Y.
2 X Y: Retorna a quantidade de elementos distintos da união entre o conjunto X com o Y.

Entrada

A entrada é composta por diversas instâncias. A primeira linha da entrada contém um inteiro T indicando o número de instâncias. Cada instância inicia com um inteiro N (1 ≤ N ≤ 10⁴), representando a quantidade de conjuntos que Dabriel possui. As próximas N linhas começam com um inteiro Mi (1 ≤ Mi ≤ 60), que indica o total de elementos que o conjunto i possui, segue então Mi inteiros Xij (1 ≤ Xij ≤ 60), que representam o valor de cada elemento. Na próxima linha contém um inteiro Q (1 ≤ Q ≤ 10⁶), representando quantas operações Dabriel deseja realizar. Nas próximas linhas terá a descrição de uma operação.

Saída

Para cada operação seu programa deverá imprimir a quantidade de elementos, conforme explicado na descrição.



#include <stdio.h>
#include <string.h>

int main()
{
    int tc, N;

    scanf("%d", &tc);

    while (scanf("%d", &N) != EOF) {
        int M[10001];
        int x, X[10001][61];
        int Q, op, x1, x2;
        int i, j;

        for (i = 1; i <= N; ++i) {
            memset(X[i], 0, 61 * sizeof(int));

            scanf("%d", &M[i]);
            for (j = 1; j <= M[i]; ++j) {
                 scanf("%d", &x);
                 X[i][x] = 1;
            }
        }

        scanf("%d", &Q);
        for (i = 0; i < Q; ++i) {
            int sum = 0;

            scanf("%d%d%d", &op, &x1, &x2);

            if (op == 1) {
                for (j = 1; j <= 60; ++j)
                    sum += X[x1][j] && X[x2][j];
            } else {
                for (j = 1; j <= 60; ++j)
                    sum += X[x1][j] || X[x2][j];
            }

            printf("%d\n", sum);
        }

        --tc;
    }

    return 0;
}

Nenhum comentário:

Postar um comentário

URI PROBLEMA 1133 - Resto da Divisão SOLUÇÃO EM C

URI Online Judge | 1133 Resto da Divisão Adaptado por Neilor Tonin, URI   Brasil Timelimit: 1 Escreva um programa que leia 2 valo...