首页 > 其他分享 >P1102 A-B 数对

P1102 A-B 数对

时间:2022-10-09 16:25:59浏览次数:51  
标签:正整数 P1102 int 数对 样例 long leq

A-B 数对

题目描述

给出一串正整数数列以及一个正整数 \(C\),要求计算出所有满足 \(A - B = C\) 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 \(N,C\)。

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

输出格式

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

样例 #1

样例输入 #1

4 1
1 1 2 3

样例输出 #1

3

提示

对于 \(75\%\) 的数据,\(1 \leq N \leq 2000\)。

对于 \(100\%\) 的数据,\(1 \leq N \leq 2 \times 10^5\),\(0 \leq a_i <2^{30}\),\(1 \leq C < 2^{30}\)。

分析

  • 已知 \(C\),可以使用双重循环枚举 \(A,B\),复杂度 \(O(n^2)\),这样会超时.
  • 那么这样的问题,考虑标记某个数出现次数,可以优化到 \(O(n)\).
  • 也可以使用下标距离的方式,对元素排序,利用下标差值确定元素个数,复杂度 \(O(nlogn)\).
  • 注意开 \(long long\),同时由于数据 \(2^30\),需要使用 \(map\) 映射。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10, INF=0x3f3f3f3f;
int a[N],n,A,B,C;
map<LL,LL> mp;
LL ans=0;

void slove1() {
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            if(i!=j && a[i]-a[j]==C) {
                ans++;
            }
        }
    }
}
void slove2() {
    for(int i=1; i<=n; i++) mp[a[i]]++;
    for(int i=1; i<=n; i++) {
        int A=a[i], B=a[i]-C;
        ans += mp[B];
    }
}
void slove3() {
    sort(a+1, a+1+n);
    for(int i=1; i<=n; i++) {
        int A=a[i], B=a[i]-C;
        int l=lower_bound(a+1, a+1+n, B)-a;
        int r=upper_bound(a+1, a+1+n, B)-a;
        ans += r-l;
    }
}
int main() {
//    freopen("data.in", "r", stdin);
    cin>>n>>C;
    for(int i=1; i<=n; i++) cin>>a[i];
    slove2();
    cout<<ans<<endl;
    return 0;
}

标签:正整数,P1102,int,数对,样例,long,leq
From: https://www.cnblogs.com/hellohebin/p/16772534.html

相关文章

  • 函数和虚函数对struct结构体大小的影响
    编者:李国帅时间:20背景:在网络传输程序中,往往把数据封装到结构体中统一传输,这时候,结构体的大小就会很重要,不注意的话,容易造成数据的丢失或者溢出。在实际的使用中要注意分析V......
  • 树状数组-归并排序-逆序对-2426. 满足不等式的数对数目
    问题描述给你两个下标从0 开始的整数数组 nums1和 nums2 ,两个数组的大小都为 n ,同时给你一个整数 diff ,统计满足以下条件的 数对 (i,j) :0<=i<j<=n-......
  • 素数对猜想
    第一次:欸哔,第五个超时;            函数那块有点繁琐=-=,每次都要从3一直找~;第二次:判断是否是素数,然后创建出一个素数表,依次相减判断是否为2,PS:网上另......
  • 4、STL-函数对象
    4、STL-函数对象4.1函数对象4.1.1函数对象概念概念:重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载()的时候,行为类似函数调用,也叫仿函数本质:函数对......
  • 力扣532(java)-数组中的 k-diff 数对(中等)
    题目:给你一个整数数组 nums和一个整数 k,请你在数组中找出不同的 k-diff数对,并返回不同的k-diff数对的数目。k-diff 数对定义为一个整数对(nums[i],nums[j])......
  • [LC646]最长数对链
    题目概述给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b<c 时,数对(c,d) 才可以跟在 (a,b) 后面。我们......
  • CCF 201409-1 相邻数对(C++)
    因为题目给的是不同的整数,所以就排序,然后for遍历找出差值为1的就好了#include<iostream>#include<bits/stdc++.h>#include<cstdio>usingnamespacestd;intn;i......
  • 14、函数对象和闭包
    14、函数对象和闭包  目录:一函数对象1.1函数可以被引用1.2函数可以作为容器类型的元素1.3函数可以作为参数传入另外一个函数1.4函数的返回值......
  • 暑假集训三[数列,数对,最小距离, 真相]
    暑假集训3数列好在这个题是单点操作,所以我们保证每一个点的\(opt\)最小就行所以相当于去求一个\(\largeax+by\equivwmx[i](mod\\gcd(a,b))\)并且保证\(\l......