1. 程式人生 > >251A Points on Line

251A Points on Line

題意:求出任意三個,其中這三個中最大的和最小的不超過d的組數,很巧的是這道題是從小到大輸入的,其實對於一個數n,找到不大於n+d的最大的數,確定這兩個之間的個數,然後以n作為第一個,然後在長度為l的任意找出2個,就是組合,二分求上界突然忘了,翻書就看到了這個函式upper_bound(),函式的返回值是小於等於n的最後一個元素的下一個,所以要-1

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 100005;

int n;
long long arr[MAXN],d;

int main(){
    while (scanf("%d%lld",&n,&d) != EOF){
        for (int i = 0; i < n; i++) 
            scanf("%lld",&arr[i]);
        long long ans = 0;
        for (int i = 0; i < n-2; i++){
            int pos = upper_bound(arr+i,arr+n,arr[i]+d) - arr;
            pos--;
            ans += (pos-i)*(pos-i-1)/2;
        }
        printf("%lld\n",ans);
    }
    return 0;
}