洛谷 P1102 数对#二分

洛谷 P1102 数对

//手写二分
ll n,x,ans;
int a[maxn];
int find1(int x)//找小于等于a[i]-C的数的函数
{
	int l = 0,r = n+1,mid;              
    while(l+1 < r)            
    {           
        mid = (l+r)/2;        
        if(a[mid] <= x)	l = mid;     
        else	r = mid;     
    }           
    return l;           
}
int find2(int x)//找小于a[i]-C的数的函数
{
	int l = 0,r = n+1,mid;              
    while(l+1 < r)            
    {           
        mid = (l+r)/2;        
        if(a[mid] < x)	l = mid;      
        else	r = mid;     
    }           
    return l;           
}
int main()
{
	cin >> n >> x;
	for(int i=1; i<=n; i++)
	{
    	cin >> a[i];
	}
	sort(a+1,a+1+n);//用二分数组要有序
	for(int i=1; i<=n; i++)
	{
    	ans += find1(a[i]+x)-find2(a[i]+x);
    	//每次累加差,小于等于减去小于的是等于
	}
	cout << ans << endl;
	return 0;
}

//STL
ll a[maxn];
ll n,c,ans;
int main() {
	cin >> n >> c;
	for(int i=1; i<=n; i++) {
		cin >> a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1; i<=n; i++) {
		ans += ((upper_bound(a+1,a+n+1,a[i]+c)-a)-(lower_bound(a+1,a+n+1,a[i]+c)-a));
	}
	cout << ans << endl;
	return 0;
}
发布了54 篇原创文章 · 获赞 0 · 访问量 1139

猜你喜欢

转载自blog.csdn.net/magic_wenge/article/details/105202207
今日推荐