【洛谷】 P1102 A-B数对

【洛谷】 P1102 A-B数对_第1张图片

//方法一
#include
#include
using namespace std;

const int MAXN = 2e5 + 10;
int num[MAXN];

int main()
{
	int N, C;
	cin >> N >> C;
	for(int i = 1; i <= N; i++)
	{
		cin >> num[i];	
	}	
	sort(num + 1, num + N + 1);		//从小大大排序 
	
	int l = 1;						//定义三个指针 
	int r1 = 1;						
	int r2 = 1;
	long long ans = 0;
	for(l = 1; l <= N; l++)			//求每个数对应的 B 的开始位置和结束位置 
	{
		while(num[r1] - num[l] <= C && r1 <= N)	//r1为结束位置的下一位置	 
		{
			++r1;
		}
		while(num[r2] - num[l] < C && r2 <= N) //r2为开始位置 
		{
			++r2;
		}

		ans += r1 - r2; 
	}

	cout << ans << endl;
	
	return 0;
}
//方法二
#include
#include
using namespace std;
 
const int MAXN = 2e5 + 10;
int num[MAXN];
map<int, int> m;

int main()
{
	int n, c;
	long ans = 0;
	cin >> n >> c;
	for(int i = 1; i <= n; i++)
	{
		cin >> num[i];			//输入 A 
		m[num[i]]++;			// 记录每个 A 的个数 
		num[i] = num[i] - c;	//每个 A 对应的 B 是多少 
	}
	for(int i = 1; i <= n; i++)
	{
		ans = ans + m[num[i]];  //每个 B 的个数和 
	}
	
	cout << ans << endl;
	
	return 0;
}

你可能感兴趣的:(洛谷,map)