92分求助
  • 板块P1102 A-B 数对
  • 楼主yzzxljxx
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/7 00:18
  • 上次更新2023/11/7 13:16:10
查看原帖
92分求助
1077738
yzzxljxx楼主2023/11/7 00:18

这道题我写了好几遍,第三个数据总是出错,心态崩了。我用的是自己写的函数,应该和upperbound和lowerbound差不多,但是就是不太行。大佬的题解用的map和哈希函数我是啥也看不懂。只好求救大家。

#include<bits/stdc++.h>
using namespace std;
const int Max = 2e5 + 10;
int recording[Max];
int ub(int i, int n);
int lb(int i, int n);
int main()
{
	int n, c;
	int sum = 0;
	scanf("%d %d", &n, &c);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &recording[i]);
	}
	sort(recording, recording + n);
	//for (int i = 0; i < n; i++)
	//	cout << recording[i] << " ";
	//cout << endl;
	for (int i = 0; i < n - 1; i++)
	{
		if((ub(recording[i]+c,n)!=-1) and(lb(recording[i]+c,n)!=-1))
			sum += (ub(recording[i]+c, n) - lb(recording[i]+c, n));
		/*cout << ub(recording[i]+c, n) << "   " << lb(recording[i]+c, n) <<"  "<< sum << endl;*/
	}
	printf("%d", sum);



	return 0;
}
int ub(int i, int n)
{
	int left = 0, right = n ;
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (recording[mid] > i)right = mid;
		else left = mid + 1;
	}
	if (recording[right-1] == i)return right;
	return -1;
}
int lb(int i, int n)
{
	int left = 0, right = n - 1;
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (recording[mid] < i)left = mid+1;
		else right = mid;
	}
	if (recording[left] == i)return left;
	return -1;
}
2023/11/7 00:18
加载中...