Codeforces 1475C. Ball en Berland (tolerancia dual)

Portal de temas
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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
*/

Supongo que te gusta

Origin blog.csdn.net/diviner_s/article/details/113252309
Recomendado
Clasificación