pairs(尺取)
题目描述:
John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,…,n−1). He wants to know how many pairs<a,b> that |x[b]−x[a]|≤k.(a<b)
Input
The first line contains a single integer T (about 5), indicating the number of cases.
Each test case begins with two integers n,k(1≤n≤100000,1≤k≤109).
Next n lines contain an integer xi, means the X coordinates.
Output
For each case, output an integer means how many pairs<a,b> that |x[b]−x[a]|≤k.
Sample Input
2
5 5
-100
0
100
101
102
5 300
-100
0
100
101
102
Sample Output
3
10
题意:求一组坐标中,两个坐标坐标相减的值<=k的坐标有几对。
解题思路:这里我用尺取法来做,模拟这个过程,每次让右边界到达减左边界后>k的第一个位置,在右边界移动过程中,每次r-l即为这段区间上符合要求的坐标对数,接着移动左边界,直到右边界减左边界<=k,这时再次移动右边界,每次加上r-l,重复这个过程,直到右边界无法再移动。
AC代码:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <vector>
#include <map>
#include <set>
using namespace std;
int a[100005];
int main()
{
int T;
scanf("%d",&T); //用cin会超时;
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n); //给定的数组不一定是有序的;
int l=0,r=0;
long long ans=0; //用long long;
while(1)
{
while(a[r]-a[l]<=k&&r<n) //移动右边界;
{
ans+=r-l; //每次保存结果;
r++;
}
//cout<<r<<" "<<l<<endl;
if(r==n) //r越界时终止;
break;
l++;
}
printf("%lld\n",ans);
}
return 0;
}