admin 管理员组

文章数量: 887021

【A

A-B 数对

题目背景

出题是一件痛苦的事情!

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

题目描述

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

输入格式

输入共两行。

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

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

输出格式

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

样例 #1

样例输入 #1

4 1
1 1 2 3

样例输出 #1

3

提示

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

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 2 × 1 0 5 1 \leq N \leq 2 \times 10^5 1≤N≤2×105, 0 ≤ a i < 2 30 0 \leq a_i <2^{30} 0≤ai​<230, 1 ≤ C < 2 30 1 \leq C < 2^{30} 1≤C<230。

2017/4/29 新添数据两组

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<istream>
#include<iomanip>
#include<ostream>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<fstream>
#include<stack>
#include<ctime>
#include<deque>
#include<queue>
#include <sstream>
#include <numeric>
#pragma warning (disable:4996)using namespace std;const int N = 2e+5+5;
int a[N] = {0};int main()
{int n, c; cin >> n >> c; long long sum = 0;for (int i = 1; i <= n; i++){cin >> a[i];}sort(a+1, a +1+ n);//先排序,方便后续的指针操作for (int i = 1, j = 1, k = 1; i <= n; i++)//遍历数组{while (j <= n && a[j] - a[i] < c)j++;    //j在k后面,差别在于是否存在等于的情况,即j小于k,a[j]要么是数对之一,要么不是while (k <= n && a[k] - a[i] <= c)k++;if (a[j] - a[i] == c && a[k - 1] - a[i] == c && k - 1 >= 1)//k-1要合理sum += k - j;//直接加上一堆满足条件的值}cout<<sum;return 0;
}

本文标签: A