关闭

CodeForces 251A. Points on Line(数学 lower_bound )

标签: 数学STL
773人阅读 评论(0) 收藏 举报
分类:

题目链接:http://codeforces.com/problemset/problem/251/A


Little Petya likes points a lot. Recently his mom has presented him n points lying on the line OX. Now Petya is wondering in how many ways he can choose three distinct points so that the distance between the two farthest of them doesn't exceed d.

Note that the order of the points inside the group of three chosen points doesn't matter.

Input

The first line contains two integers: n and d (1 ≤ n ≤ 105; 1 ≤ d ≤ 109). The next line contains n integers x1, x2, ..., xn, their absolute value doesn't exceed 109 — the x-coordinates of the points that Petya has got.

It is guaranteed that the coordinates of the points in the input strictly increase.

Output

Print a single integer — the number of groups of three points, where the distance between two farthest points doesn't exceed d.

Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cincout streams or the %I64dspecifier.

Sample test(s)
input
4 3
1 2 3 4
output
4
input
4 2
-3 -2 -1 0
output
2
input
5 19
1 10 20 30 50
output
1
Note

In the first sample any group of three points meets our conditions.

In the seconds sample only 2 groups of three points meet our conditions: {-3, -2, -1} and {-2, -1, 0}.

In the third sample only one group does: {1, 10, 20}.



题意:

给出n和k,然后给出一个大小为 n 的集合,从集合中取出3个数,
最大数与最小数的差值小于k的方式有多少种。



代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL __int64
int main()
{
    int n;
    LL d;
    LL a[100047];
    while(~scanf("%d%I64d",&n,&d))
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%I64d",&a[i]);
        }
        LL ans = 0;
        for(int i = 1; i < n; i++)
        {
            LL tt = i-(lower_bound(a,a+i,a[i]-d)-a)-1;
            ans+=tt*(tt+1)/2;//C n 2
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
/*
4 3
1 2 3 4
4 2
-3 -2 -1 0
5 19
1 10 20 30 50
*/


1
0
查看评论

lower_bound二分的三种写法

给定一个排序数组和一个数target,找出target在数组中第一次出现的位置,如不存在返回-1 写法一: int binarySearch(vector &array, int target) { int l = 0, r = array.size() - 1; ...
  • binling
  • binling
  • 2015-01-03 20:41
  • 779

CodeForces 251A. Points on Line(数学 lower_bound )

CodeForces 251A. Points on Line(数学 lower_bound )
  • u012860063
  • u012860063
  • 2015-07-07 19:47
  • 773

nyoj+二分函数lower_bound+大数组的注意事项

点击打开链接///数组开的时候要注意大小,一般要开成全局(局部栈很小) #include #include #include #include #include #include #include #include using namespace std; int main() { vect...
  • u013554860
  • u013554860
  • 2015-10-31 18:17
  • 429

Codeforces 710B-Optimal Point on a Line

B. Optimal Point on a Line time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output You ...
  • LDUtyk
  • LDUtyk
  • 2016-08-23 08:24
  • 764

【LeetCode】Max Points on a Line 解题报告

【题意】 求二维平面上n个点中,最多共线的点数。 【思路】 比较直观的方法是,三层循环,以任意两点划线,判断第三个点是否在这条直线上。 【Java代码】 /** * Definition for a point. * class Point { * int x; * int ...
  • ljiabin
  • ljiabin
  • 2014-08-28 22:05
  • 6379

STL之二分查找(binary_search(),lower_bound(),upper_bound() )

二分查找(二分检索):   二分法检索又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中,     首先将给定值key与   字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;...
  • zwj1452267376
  • zwj1452267376
  • 2015-07-30 16:44
  • 2490

lower_bound用法

lower_bound的headfile是algorithm.lower_bound的工作原理就是二分查找了。lower_bound的作用:lower_bound的返回值减去数组的地址就是要查找的元素在数组中的位置。即:Pos = lower_bound(a, a+10, 3)-a;那么Pos就是在...
  • yexiaohhjk
  • yexiaohhjk
  • 2015-04-10 00:49
  • 1692

Leetcode: Max Points on a Line

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 任意一条直线都可以表述为 y = ax + b 假设,有两个点(x1,y1...
  • doc_sgl
  • doc_sgl
  • 2013-12-03 22:57
  • 18483

CodeForces 710B Optimal Point on a Line(首场完美被虐,安安睡吧+总结)

http://codeforces.com/contest/710/problem/B B. Optimal Point on a Line time limit per test 1 second memory limit per test 256 megabytes ...
  • shyazhut
  • shyazhut
  • 2016-08-22 23:26
  • 870

CodeForces - 251A Points on Line

题意:求出任意三个,其中这三个中最大的和最小的不超过d的组数,很巧的是这道题是从小到大输入的,其实对于一个数n,找到不大于n+d的最大的数,确定这两个之间的个数,然后以n作为第一个,然后在长度为l的任意找出2个,就是组合,二分求上界突然忘了,翻书就看到了这个函数upper_bound(),函数的返回...
  • u011345136
  • u011345136
  • 2013-10-17 23:43
  • 1013
    Motto
    • 你必须非常努力,
    • 才能看起来毫不费力。
    • tianyiming:2013/10/15 18:00
    • wdnlwzd:2014/07/30 21:32
    • vasttian: 2016/12/29 12:00
    Vasttian
    个人资料
    • 访问:1078526次
    • 积分:21065
    • 等级:
    • 排名:第449名
    • 原创:871篇
    • 转载:72篇
    • 译文:0篇
    • 评论:253条