Luogu洛谷 P1102 A-B 数对 题解

题目

题目链接

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;
}
posted @ 2021-02-23 11:15  1v7w  阅读(83)  评论(0编辑  收藏  举报