Codeforces 1475 C. Ball in Berland
题目分析:
这个题其实就是给你一堆坐标,让你找到合适的有多少对
思路分析:
坐标的话,首先想到用 pair<int,int>
和 set
进行存储坐标,然后就是对坐标进行一次遍历,时间复杂度是 O(n)
AC代码:
#include <iostream>
#include <set>
#include <cstring>
#define PII pair<int,int>
#define ll long long
using namespace std;
const int N = 2 * 1e5 + 10;
set<PII> s;
int a, b, k;
int boy[N];
int girl[N];
int boy_num[N];
int girl_num[N];
int main() {
int t;
cin >> t;
while (t--) {
cin >> a >> b >> k;
memset(boy_num,0,sizeof(boy_num));
memset(girl_num,0,sizeof(girl_num));
for (int i = 0; i < k; i++) {
cin >> boy[i];
boy_num[boy[i]]++;
}
for (int i = 0; i < k; i++) {
cin >> girl[i];
girl_num[girl[i]]++;
}
for (int i = 0; i < k; i++)
s.insert({boy[i], girl[i]});
ll ans = 0;
// 对坐标进行遍历
for (auto item : s) {
// 核心思想
ans += k - boy_num[item.first] - girl_num[item.second] + 1;
}
// 每对算了两边,所以需要把 答案 / 2 才是最终结果
cout << ans / 2 << endl;
s.clear();
}
return 0;
}