【洛谷】P1102 A-B 数对

简介: 洛谷 P1102 A-B 数对

1. 题目描述

image.png

2. 思路分析

将A-B=C转化成A=B+C,然后遍历数组,让数组的每个元素加C,再查找原数组中是否存在对应数组元素+C之后的值。(数据量比较大,所以我们就用二分在查找过程中提高效率,这里就用到了二分模板)。

二分模板可以看这篇文章https://blog.csdn.net/m0_62531913/article/details/132391682?spm=1001.2014.3001.5501

因为原数组不一定是有序的,所以我们先使用C++STL库中的sort()函数进行升序排序,这样的数组就是有序的。我们查找每个元素+C第一次出现的下标和最后一次出现的下标,再让最后一次出现的下标-第一次出现的下标+1(用sum不断累加这个值),最后sum的值就是A-B数对的个数。

3. 代码实现

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N], n, c;
ll sum;

int find1(int x)
{
   
   
    int l = -1, r = n;
    while (l + 1 < r)
    {
   
   
        int mid = (l + r) >> 1;
        if (a[mid] >= x) r = mid;
        else l = mid;
    }
    if (a[r] == x) return r;
    else return 0;
}

int find2(int x)
{
   
   
    int l = -1, r = n;
    while (l + 1 < r)
    {
   
   
        int mid = (l + r) >> 1;
        if (a[mid] <= x) l = mid;
        else r = mid;
    }
    if (a[l] == x) return l;
    else return 0;
}

int main()
{
   
   
    cin >> n >> c;
    for (int i = 0; i < n; i++) cin >> a[i];
    sort(a, a + n);
    for (int i = 0; i < n; i++)
    {
   
   
        int x = a[i] + c;
        if (find1(x))
            sum += find2(x) - find1(x) + 1;
    }
    cout << sum << endl;
    return 0;
}

image.png

相关文章
|
5月前
|
算法 索引
【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)
该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。
50 0
|
5月前
|
存储 C++
【洛谷 P1102】A-B 数对 题解(映射)
这是一个编程题目,要求计算给定正整数序列中满足 \( A - B = C \) 的数对个数。输入包含两行:正整数 \( N \) 和 \( C \),以及一串正整数。使用一个哈希映射记录每个数字出现的次数,然后遍历映射,如果找到 \( A = B + C \),则累加对应计数。样例输入输出为 \( N=4, C=1 \),数列为 \( 1 1 2 3 \),答案为 \( 3 \)。代码使用 C++ 实现,通过维护一个映射来存储数字频率并计算数对。
35 0
|
6月前
|
算法 C++
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
|
6月前
|
算法 测试技术 C#
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
|
6月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
65 0
|
6月前
剑指Offer LeetCode 面试题11. 旋转数组的最小数字
剑指Offer LeetCode 面试题11. 旋转数组的最小数字
39 0
|
机器学习/深度学习 算法 NoSQL
【基础算法】浅浅刷个小题 # 反转字符串 # 反转字符串 II # 三个数的最大乘积 #
【基础算法】浅浅刷个小题 # 反转字符串 # 反转字符串 II # 三个数的最大乘积 #
|
算法 C++
每日算法系列【LeetCode 1363】形成三的最大倍数
每日算法系列【LeetCode 1363】形成三的最大倍数
|
算法 C++ Python
每日算法系列【LeetCode 16】最接近的三数之和
每日算法系列【LeetCode 16】最接近的三数之和
|
机器学习/深度学习
数论整理之特殊数two:卡特兰数
数论整理之特殊数two:卡特兰数