Codeforces 1475C. Ball in Berland(二元容斥)

题目传送门
在这里插入图片描述
在这里插入图片描述

题意:
一个班级有a个男生和b个女生,现在这个班级有k对男女愿意一起出席毕业典礼,这里注意k对男女中可能会有某个男生或女生出现在多个pair中。
你从这k对中找出两对,使得这两对中的男生不相同、女生不相同,即一个男生或女生不可能在一个典礼中出现在两对中。
让你求出一共有多少种可能的组合方式。

分析:
针对下面的这样一组数据,有4对匹配的方式,假设我们让第一对(1,2)出席毕业典礼,即男1号女2号参加,那么与男1号相联系的其他组合均不能再参加,与女2号相关的其他组合也不能参加。那么就有 【k-与男1号相联系的其他组合均不能再参加的数量-与女2号相关的其他组合也不能参加的数量 + 1情况数】(在我们选择(1,2)参加的情况下,会有的组合方式的数量)。
合法方案数=所有的方案数-不合法的方案数.
P(a∪b)=P(a)+P(b)−P(ab)

那我们依次枚举k次,将所有可以组合的数量累加,注意需要再将总情况除以2(模拟下来我们发现所有的情况计算了两次)。

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

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/113252309