hdu 5178

来源:互联网 发布:mac上使用的ios模拟器 编辑:程序博客网 时间:2024/04/30 14:01

pairs

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1056    Accepted Submission(s): 372


Problem Description
John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,,n1). 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(1n100000,1k109).
Next n lines contain an integer x[i](109x[i]109), 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
25 5-10001001011025 300-1000100101102
 

Sample Output
310
 

Source
BestCoder Round #31
 

Recommend
hujie   |   We have carefully selected several similar problems for you:  5182 5181 5180 5179 5178 
 
直接二分,时间复杂度nlog(n)

#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>using namespace std;#define ll long longll x[100010];int main(){    int T; scanf("%d",&T);    while(T--){        int n,k;        scanf("%d%d",&n,&k);        for(int i=0;i<n;i++){            scanf("%I64d",&x[i]);        }        sort(x,x+n);        ll sum=0;        for(int i=0;i<n-1;i++){            int left=i+1;            int right=n-1;            int mid=(left+right)>>1;            while(1){                int t_mid=mid;                if(x[mid]-x[i]>k){                    right=mid-1;                }                else if(x[mid]-x[i]<k){                    left=mid+1;                }                else{                    break;                }                mid=(left+right)>>1;                if(t_mid==mid){                    break;                }            }            if(x[mid]-x[i]<=k){                sum+=(ll)mid-i;            }        }        printf("%I64d\n",sum);    }    return 0;}



0 0
原创粉丝点击