我的第一篇博客!XD
第一次写,小激动
一、解题思路
我一个菜鸡,看到这题,刚开始也就能想到n2算法,但肯定是过不了的,所以我又绞尽脑汁,想了一波,终于在“这题必有巧”的信念指导下,想出来了。
目标是找到2个组合,让他们不冲突,那么可以显然知道,有男孩i的组合和有他自己的组合必然冲突,有女孩i的组合和有她自己的组合也必然冲突,那么剩下的都不冲突。
那么怎么知道对于第i个组合,剩下多少组合能与之配对呢?
很简单,用k - 男孩i参与的组合总数 - 女孩i参与的组合总数 + 1即可。
为什么要加一呢?因为同时包含boy[i]和girl[i]的组合有且只有一个,根据容斥原理,要减一。
最后的答案要/2输出,因为每个组合都配对和被配对一次
二、代码
代码如下(示例):
#include <bits/stdc++.h>
using namespace std;
long long t,a,b,k,ans;
long long boy[200002],girl[200022];
long long boy_have[200002],girl_have[200022];
int main()
{
cin >> t;
while(t--)
{
ans = 0;
cin >> a >> b >> k;
for(long long i = 1;i <= a;i++)
boy_have[i] = 0;
for(long long i = 1;i <= b;i++)
girl_have[i] = 0;
for(int i = 1;i <= k;i++)
{
cin >> boy[i];
boy_have[boy[i]]++;
}
for(int i = 1;i <= k;i++)
{
cin >> girl[i];
girl_have[girl[i]]++;
}
if(a == 1||b == 1)
{
cout << 0 << endl;
continue;
}
for(int i = 1;i <= k;i++)
{
ans+=(k-boy_have[boy[i]]-girl_have[girl[i]]+1);
}
cout << ans/2 << endl;
}
return 0;
}