Posted onIn做题记录Word count in article: 1.5kReading time ≈5 mins.
CodeForces 1475C - 做题记录
原题链接
CodeForces
洛谷
题意理解
数据组数 T
男孩 a 个,女孩 b 个,舞伴 k 对
思路
存储数据
1
vector<pair<int, int>> dancePair;
计算答案
方法一
期望得分:20
暴力枚举每一对舞伴 (boyi−girli)
1 2 3 4 5 6 7 8 9
registerunsignedlonglong ans = 0; for (registerint i = 0; i < k - 1; ++i) { for (registerint j = i + 1; j < k; ++j) { if ((dancePair[i].first != dancePair[j].first) and (dancePair[i].second != dancePair[j].second)) { ++ans; } } } cout << ans << endl;
结果第四个点 TLE 了,一看时间复杂度 O(n2),难道 n2 过百万已经不灵验了?(好吧题目中的是两百万)
方法二
期望得分:100
仔细研究发现,我们可以枚举每一对舞伴,并将所有 k 对舞伴中除了与他们有相同的组成以外的加入答案中即可。
int aryBoy[MAX_K], aryGirl[MAX_K]; for (registerint i = 0, tmp; i < k; ++i) { cin >> tmp; ++aryBoy[tmp]; } for (registerint i = 0, tmp; i < k; ++i) { cin >> tmp; ++aryGirl[tmp]; }
registerunsignedlonglong ans = 0; for (registerint i = 0; i < k; ++i) { ans += k - aryBoy[dancePair[i].first] - aryGirl[dancePair[i].second] + 1; } ans /= 2; cout << ans << endl;