UVALive

来源:互联网 发布:putty上传文件到linux 编辑:程序博客网 时间:2024/06/01 18:33



简单二分题,前两个数相加为一个数组,后两个数相加为一个数组,然后遍历第一个数组并且二分第二个数组即可。

#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=4400;int n,a[4][N],b[N*N],c[N*N];int bSearch1(int _begin, int _end, int e){int mid, left = _begin, right = _end;while(left <= right){mid = (left + right) >> 1;if(c[mid] >= e) right = mid - 1;else left = mid + 1;}return left;}int bSearch2(int _begin, int _end, int e){int mid, left = _begin, right = _end;while(left <= right){mid = (left + right) >> 1;if(c[mid] > e) right = mid - 1;else left = mid + 1;}return right;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)        {            for(int j=0;j<4;j++)            {                scanf("%d",&a[j][i]);            }        }        int m1=0,m2=0;        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)            {                b[m1++]=a[0][i]+a[1][j];                c[m2++]=a[2][i]+a[3][j];            }        sort(c,c+m2);        long long ans=0;        for(int i=0;i<m1;i++)        {            int l=bSearch1(0,m2-1,-b[i]);            int r=bSearch2(0,m2-1,-b[i]);            if(c[l]==-b[i])            {                ans+=(long long )r-l+1;            }        }        printf("%lld\n",ans);        if(T!=0)    printf("\n");    }}/*16-45 22 42 -16-41 -27 56 30-36 53 -37 77-36 30 -75 -4626 -38 -10 62-32 -54 -6 45*/


原创粉丝点击