CF 153 div1 A

题目:A - Points on Line

思路:二分找到不比当前值加差值打的最后一个数字,然后讨论

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
long long node[100010];
int fun(int l,int r,long long x)
{
    if(l>=r)
        return l;
    int mid=(l+r)/2;
    if(node[mid]==x)
        return mid;
    if(node[mid]<x)
        return fun(mid+1,r,x);
    return fun(l,mid-1,x);
}
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>node[i];
    long long ans=0;
    long long tmp;
    long long cnt=1;
    for(int i=1;i<=n;i++)
    {
        tmp=fun(cnt,n,node[i]+k);
        while(node[tmp]>node[i]+k)
            tmp--;
        cnt=tmp;
        tmp-=(i+1);
        if(tmp>=2)
            ans+=tmp*(tmp-1)/2;
        if(tmp>=1)
            ans+=tmp;
    }
    cout<<ans<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/overflow/p/3207639.html