Luogu洛谷 P1102 A-B 数对 题解
题目
题目链接
题解
将\(A-B=C\,\)变形后得到\(A=B+C\)。其中,\(C\)是常量,\(B\)为变量,只需要找出\(A\)是否在数组中即可。
需要注意的是,假如数组为\(1\,1\,2\,2\),当\(C=1,\,B=1\)时,这时候\(A=2\)在数组中有2个,结果需要\(+2\)。也就是需要找出数组中最左边的\(A\)与最右边的\(A\),然后位置相减。
Then show the code.
#include <cstdio>
#include <algorithm>
using namespace std;
int n, l[(int)2e5+5], c;
long long cnt;
int main(){
scanf("%lld%lld", &n, &c);
for(int i=0; i<n; i++)
scanf("%lld", &l[i]);
sort(l, l+n);
for(int i=0; i<n; i++){
int a = c+l[i];
int lb=0, ub=n-1, mid, tmp=0;
//寻找最右边的 A
while(lb<ub){
mid = (lb+ub)/2+1;
if(l[mid] <= a) lb = mid;
else ub = mid-1;
}
if(l[ub] == a) tmp=ub;
//寻找最左边的 A
lb=0, ub=n-1;
while(lb<ub){
mid = (lb+ub)/2;
if(l[mid] >= a) ub = mid;
else lb = mid+1;
}
if(l[lb] == a) tmp= tmp-lb+1;
cnt += tmp;
}
printf("%lld", cnt);
return 0;
}
不忘初心方得始终