251A Points on Line
阿新 • • 發佈:2018-12-24
題意:求出任意三個,其中這三個中最大的和最小的不超過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; }