题目链接:
https://vjudge.net/problem/35188/origin
题目大意:
要求你找到一个 i < j < k时有 a[k]-a[i] <= d的组的个数。
这道题的思路就是每输入一个a[i]就是找到那个第一个大于或等于a[i]-d的值!,设a[i]-d = mn, 则用lower_bound()函数可以得到这个第一个大于或者等于mn的值的下标。
关于lower_bound()函数的详细用法可以看这个博客:
https://blog.csdn.net/qq_40160605/article/details/80150252
然后得到下标后,就观察规律,发现这个长度是呈等差数列形式的,其中,a[1] = 1, a[n] = i-idex-1
所以有其中三元组的个数为:(i-idex-1)((i-idex-1)+1)/2;
下面是AC代码:

#include <iostream> #include <cstdio> #include <algorithm> #define ll long long using namespace std; const int MX = 1e5+10; ll a[MX]; int main() { ll ans = 0; ll n, d; scanf("%lld%lld", &n, &d); for(ll i = 0; i < n; ++i) { scanf("%lld", &a[i]); ll mn = a[i]-d; ll idx = lower_bound(a, a+i, mn)-a; ans += (i-idx-1)*((i-idx-1)+1)/2; } printf("%lld", ans); }
如有疑问,欢迎评论指出!