3030: 【普及-】【P1102】A-B 数对

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:21 解决:12

题目描述

给出一串正整数数列以及一个正整数 lns="http://www.w3.org/1998/Math/MathML">,要求计算出所有满足 lns="http://www.w3.org/1998/Math/MathML">= 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入

输入共两行。

第一行,两个正整数 lns="http://www.w3.org/1998/Math/MathML">,

第二行,lns="http://www.w3.org/1998/Math/MathML"> 个正整数,作为要求处理的那串数。

输出

一行,表示该串正整数中包含的满足 lns="http://www.w3.org/1998/Math/MathML">= 的数对的个数。

样例输入 复制

4 1
1 1 2 3

样例输出 复制

3

提示

对于 lns="http://www.w3.org/1998/Math/MathML">75% 的数据,lns="http://www.w3.org/1998/Math/MathML">12000

对于 lns="http://www.w3.org/1998/Math/MathML">100% 的数据,lns="http://www.w3.org/1998/Math/MathML">12×105lns="http://www.w3.org/1998/Math/MathML">0<230,lns="http://www.w3.org/1998/Math/MathML">1<230

分析:这回可以用map 更方便地完成。枚举每一个数A,想知道有多少个B满足 A-B=C,即有多少 B=A-C。有一种思路是建立一个很大的数组,下标就是这些数字,这样直接就可以查询到这个数字是否存在。但是由于值域非常大,若这么做的,则会造成内存超限。
凭借 STL,就可以使用这样的思路完成本题了。把每个数插人map里面,下标就是这些数字,值就是这些数字的个数。然后枚举A,查有多少B满足B等于 A-C 即可。


#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
map<int,int> ds;
int a[MAXN],n,c;
long long ans;
int main(){
    cin >> n >> c;
    for (int i=1; i<=n ; i++)
        cin >> a[i],ds[a[i]]++; //把每个元素加入map中,如果原先不存在默认初始值为0
	for (int i=1; i<=n ; i++)
	    ans +=ds[a[i] - c]; //对于每个A,查询有多少B满足
	cout << ans << endl; 
	return 0;
}