Codeforces 1475C - Ball in Berland

在这里插入图片描述
题目大意

道题目给我们 a 个男孩和 b 个女孩,有 k 对组合,让我们找出来两对,其中并没有一个人出现过两次的组合有多少种。

题目分析

容斥原理,我们记录下每个男孩在配对中出现了 cnt1[i] 次,每个女孩在配对种出现了 cnt2[i] 次,那么我们遍历这 k 对,对于每一对来说,另一对可以选择的方案数为:k - cnt1[i] - cnt2[i] + 1,减去当前男孩在的组数和当前女孩在的组数,这个男孩和女孩减去了两次,所以加1.

#include <iostream>

using namespace std;

const int N = 2e5+10;

pair<int,int> edges[N];

void solve()
{
    
    
	int cnt1[N] = {
    
    0}, cnt2[N] = {
    
    0};
	int a , b , k;
	cin >> a >> b >> k;
	for(int i = 1; i <= k; i++) cin >> edges[i].first , cnt1[edges[i].first]++;
	for(int i = 1; i <= k; i++) cin >> edges[i].second , cnt2[edges[i].second]++;
	long long res = 0;
	for(int i = 1; i <= k; i++) 
	{
    
    
		int x = edges[i].first , y = edges[i].second;
		res += k - cnt1[x] - cnt2[y] + 1;
	}
	cout << res / 2 << endl;
}

int main()
{
    
    
	int t; cin >> t;
	while(t--) solve();
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/cosx_/article/details/113759937