洛谷 B4241:[海淀区小学组 2025] 统计数对 ← STL map

【题目来源】
https://www.luogu.com.cn/problem/B4241

【题目描述】
陶陶是一个计算机爱好者,对二进制数有着特别的喜好,遇到各种各样的数据,他总能找到跟 2 的整数次幂的关系。现在,他获得了一个长度为 n 的数列 a1,a2,...,an,他发现其中有些元素的和恰好是 2 的整数次幂。对于给定的 a1,a2,...,an,你的任务是统计有多少个数对 (i,j) 满足 ai+aj=2^x,其中 x∈N∗,i<j,这里 N∗ 表示正整数集合。

【输入格式】
第一行包含一个整数 n,第二行包含 n 个整数 a1,a2,...,an。

【输出格式】
仅有一个正整数,表示满足 ai+aj 是 2 的整数次幂的数对 (i,j) 的个数。

【输入样例】
4
7 3 2 1

【输出样例】
2

【数据范围】
对于 40% 的数据,1≤n≤10^3,对于每一个正整数 i,1≤i≤n,都有 1≤ai≤10^9。
对于另外 60% 的数据,1≤n≤10^5,对于每一个正整数 i,1≤i≤n,都有 1≤ai≤10^9。

【算法分析】
● 因为 1≤ai≤10^9,则 ai+aj<=2×10^9,而 2^30>2×10^9,所以在 for 循环中 j 取小于等于 30。
● STL map 用法:https://blog.csdn.net/hnjzsyjyj/article/details/146118701
● mpa\[i]-- 在数组元素配对算法中起到避免重复计数的关键作用。
例如,针对数组 1, 1, 2,处理第一个 1 时,先执行 mp1--,此时 mp1 从 2 变为 1。
然后寻找配对数字 1 时,就不会找到自己(第一个 1),但还能找到另一个 1(第二个 1)来形成配对。

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
map<int,int> mp;
int a[maxn];
int ans,t;

int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        mp[a[i]]++;
    }

    for(int i=1; i<=n; i++) {
        mp[a[i]]--;
        for(int j=0; j<=30; j++) {
            t=(1<<j)-a[i];
            if(mp.count(t)) ans+=mp[t];
        }
    }
    cout<<ans<<endl;

    return 0;
}

/*
in:
4
7 3 2 1

out:
2
*/

【参考文献】
https://www.luogu.com.cn/problem/solution/B4241

相关推荐
祖力551 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
白狐_7984 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2585 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
船厂电气自动化ai大模型6 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光6 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
不会就选b10 小时前
算法日常・每日刷题--<优先级队列>2
数据结构·算法
LuminousCPP11 小时前
单链表专题(三)-刷题复盘篇:从快慢指针到环形链表 II 数学推导
数据结构·经验分享·笔记·学习·算法·链表
ChaoZiLL11 小时前
二叉树经典例题
数据结构·算法
三克的油12 小时前
算法基础-1
数据结构·c++·算法
一米阳光866112 小时前
软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树
数据结构·笔记·职场发展·软考·软件设计师·中级职称