【洛谷】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

相关文章
|
3月前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
39 0
|
3月前
|
存储 C++
【洛谷 P1102】A-B 数对 题解(映射)
这是一个编程题目,要求计算给定正整数序列中满足 \( A - B = C \) 的数对个数。输入包含两行:正整数 \( N \) 和 \( C \),以及一串正整数。使用一个哈希映射记录每个数字出现的次数,然后遍历映射,如果找到 \( A = B + C \),则累加对应计数。样例输入输出为 \( N=4, C=1 \),数列为 \( 1 1 2 3 \),答案为 \( 3 \)。代码使用 C++ 实现,通过维护一个映射来存储数字频率并计算数对。
20 0
|
4月前
|
算法 C++
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
|
4月前
|
算法 测试技术 C#
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
|
4月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
60 0
【剑指offer】-和为S的两个数-38/67
【剑指offer】-和为S的两个数-38/67
|
机器学习/深度学习
数论整理之特殊数two:卡特兰数
数论整理之特殊数two:卡特兰数
AcWing 第 20 场周赛 3995. 最小的和(贪心 优先队列)
AcWing 第 20 场周赛 3995. 最小的和(贪心 优先队列)
121 0
AcWing 第 20 场周赛 3995. 最小的和(贪心 优先队列)
|
C++
蓝桥杯练习题四 - 排它平方数(c++)
蓝桥杯练习题四 - 排它平方数(c++)
103 0
【每日算法打卡】LCS 02. 完成一半题目
【每日打卡系列】LeetCode 简单题 200 道
【每日算法打卡】LCS 02. 完成一半题目