二分三元组 CodeForces - 251A

题目链接:

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);
}
View Code

如有疑问,欢迎评论指出!

posted @ 2019-01-23 16:21  mpeter  阅读(131)  评论(0编辑  收藏  举报