题目大意
道题目给我们 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;
}