洛谷 1102 P1102 A-B数对

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32734731/article/details/53121827

题目描述

出题是一件痛苦的事情!

题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!

好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)

输入输出格式

输入格式:

第一行包括2个非负整数N和C,中间用空格隔开。

第二行有N个整数,中间用空格隔开,作为要求处理的那串数。

输出格式:

输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。

对于90%的数据,N <= 2000;

对于100%的数据,N <= 200000。

所有输入数据都在longint范围内。

输入输出样例

输入样例#1:
4 1
1 1 2 3
输出样例#1:
3







刚刚学会二分就用到了。= =兴奋ing


#include<iostream>
#include<string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
int a[1000000];
int main()
{
    int n,c;
    while(scanf("%d%d",&n,&c)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int sum=0;
        int qq=1;
        for(int i=0;i<=n;i++)
        {
            if(a[i]==a[i+1])  //加速- -
            {
                qq++;
                //cout<<qq<<endl;
                continue;
            }
            int l=i+1,h=n-1,mid;
            while(l<=h)  //二分大加速
            {
                mid=(l+h)/2;
                if(a[mid]-a[i]>c) h=mid-1;
                else if(a[mid]-a[i]<c) l=mid+1;
                else break;
            }

            if(a[mid]-a[i]==c)
            {
                sum+=qq;
                while(a[mid]==a[mid-1]) mid--;
                while(a[mid]==a[mid+1])
                {
                    sum+=qq;
                    mid++;
                }
            }

            if(a[i]!=a[i+1]) qq=1;
        }
        printf("%d\n",sum);
    }
}






阅读更多
换一批

没有更多推荐了,返回首页