前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【题解】A-B数对

【题解】A-B数对

作者头像
fishhh
发布2022-08-31 14:48:37
4580
发布2022-08-31 14:48:37
举报
文章被收录于专栏:OI算法学习笔记OI算法学习笔记

题目描述

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个整数 N, C。

第二行,N 个整数,作为要求处理的那串数。

输出格式

一行,表示该串数中包含的满足 A - B = C 的数对的个数。

输入输出样例

输入 #1

代码语言:javascript
复制
4 1
1 1 2 3

输出 #1

代码语言:javascript
复制
3

说明/提示

题目分析

题目要求计算出所有 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。已知C,此时转换下等式可得到 A - C = B。我们可以尝试利用单调性对齐进行处理,若A呈单调增,由于C的值固定,所以B也是单调增的。我们可以提前对所有的数进行升序排列,以遍历到的a[i]作为A,我们去统计与之匹配的a[i]-C的个数,由于排序过,所以所有能匹配的a[i]-C一定是连续的。

而由于单调性,a[i] 确定的答案区间

一定是与 a[i-1]确定的答案区间

重叠或者在其右侧。这要就不需要重复在1∼n 的范围内寻找和a[i] 对应的 a[i]-C了,只需在之前答案的基础上往后找即可,这块的复杂度为O(n)的复杂度,整体复杂度为O(nlogn)。

代码实现

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e5+5;
int a[N];
int n,c;
//a-b=c => a-c=b
int main(){
    cin>>n>>c;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    int l=1,r=1;
    long long sum=0;
    for(int i=1;i<=n;i++){
        int B=a[i]-c;
        while(r<=n &&  a[r]<=B) r++;
        while(l<=r && a[l]<B) l++;
        sum+=(r-l);
    }
    cout<<sum;
    return 0;
}

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
  • 说明/提示
  • 题目分析
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档