B4241 [海淀区小学组 2025] 统计数对
欢迎报名洛谷网校,期待和大家一起进步!
本题考察 map 的使用。
题目询问有多少个数对满足 x & (x - 1) 判断正整数
不妨移项,有 map。具体而言,使用 map <int, int> m 存储
接下来演示一个经典的错误写法:
for (int i = 1; i <= n; i++) {
m[a[i]]--;
for (int j = 0; j <= 30; j++)
ans += m[(1 << j) - a[i]];
}
在这份代码中确实是在枚举 m[a[i]]-- 的方式避免重复统计,但是这一份代码提交只能获得部分分数。这是因为若是直接访问 map 下标,此时如果 map 容器中就会存在
一个更好的做法是,首先使用 m.count() 函数,判断这个下标是否在 map 中出现过。若没出现过就不管,出现过了再计算。这样可以避免反复地新建下标。由于 count 函数单次是
参考代码:
for (int i = 1; i <= n; i++) {
m[a[i]]--;
for (int j = 0; j <= 30; j++) {
if (m.count((1 << j) - a[i]))
ans += m[(1 << j) - a[i]];
}
}