URI Online Judge | 2222
Brincando com Conjuntos
Por Gabriel Duarte, UNIFESO
Brazil
Timelimit: 1
Brazil
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.
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 Q 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