Significado de la pregunta:
Una clase tiene un niño y una niña. Ahora hay k parejas de hombres y mujeres en esta clase que están dispuestos a asistir juntos a la ceremonia de graduación. Tenga en cuenta que un cierto niño o niña puede aparecer en varias parejas entre los k parejas.
Se encuentran dos pares de estos k pares, por lo que los niños y niñas de los dos pares son diferentes, es decir, es imposible que un niño o una niña aparezcan en dos pares en una ceremonia.
Te permite averiguar cuántas combinaciones posibles hay.
Análisis: Para
el siguiente conjunto de datos, hay 4 pares de métodos de emparejamiento. Supongamos que dejamos que el primer par (1, 2) asista a la ceremonia de graduación, es decir, el hombre # 1 y la mujer # 2, luego el otro relacionado con el hombre. Las combinaciones # 1 ya no pueden participar, y otras combinaciones relacionadas con la número 2 femenina no pueden participar. Luego está [k-el número de otras combinaciones relacionadas con el número masculino 1 que ya no puede participar-el número de otras combinaciones relacionadas con el número femenino 2 que no puede participar + el número de casos] (en nuestra elección (1 , 2) para participar En el caso, habrá el número de combinaciones).
El número de esquemas legales = el número de todos los esquemas - el número de esquemas ilegales.
P (a∪b) = P (a) + P (b) −P (ab)
Luego enumeramos k veces por turno, acumulamos todos los números que se pueden combinar y prestamos atención a la necesidad de dividir la situación total por 2 (después de la simulación, encontramos que todas las situaciones se calcularon dos veces).
1 1 2 3
2 3 2 4
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
const int N = 2e5+5;
int t;
int a[N],b[N];
int n,m,k;
int f1[N],f2[N];
int main()
{
cin >> t;
while(t--)
{
cin >> n >> m >> k;
memset(f1,0,sizeof f1);
memset(f2,0,sizeof f2);
for(int i = 1; i <=k; i ++)cin >> a[i],f1[a[i]] ++;
for(int i = 1; i <= k; i ++)cin >> b[i],f2[b[i]] ++;
long long res = 0;
for(int i = 1; i <= k; i ++)
res += k - f1[a[i]] - f2[b[i]] + 1;
res /= 2;
cout << res << endl;
}
return 0;
}
/*
3
3 4 4
1 1 2 3
2 3 2 4
1 1 1
1
1
2 2 4
1 1 2 2
1 2 1 2
*/