有n个二维坐标点。

现在要在x轴上放置若干雷达,每个雷达的辐射半径都是d。

问至少需要几个雷达,才能够幅射所有点,如果辐射不到所有的点,则输出-1。

15831619305960.png

输入

第一行一个整数n(1 \le n \le 1000)n(1n1000) 和 d(1 \le d \le 10000)d(1d10000)。

接下来n行,每行输入一个点的坐标。

坐标范围[-10000,10000]。

输出

输出一个整数表示答案。

样例

输入

复制
3 2
1 2
-3 1
2 1

输出

复制
2

输入

复制
1 2
0 2

输出

复制
1

提示

子任务1,20分,1 \le n \le 101n10 , 1 \le d \le 101d10,坐标范围[-10,10]。

子任务2,30分,1 \le n \le 1001n100 , 1 \le d \le 1001d100,坐标范围[-100,100]。

子任务3,50分,1 \le n \le 10001n1000 , 1 \le d \le 100001d10000,坐标范围[-10000,10000]。

 

 

#pragma warning(disable:4996)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <set>
#define MAX 1001
using namespace std;

int main()
{
    int n, ans = 1;
    bool flag = true;
    double r, x, y;
    scanf("%d%lf", &n, &r);
    std::vector<std::pair<double, double>> range(n);
    for (int i = 0; i < n; i++)
    {
        scanf("%lf%lf", &x, &y);
        if (r < fabs(y))
        {
            flag = false;
        }
        if (!flag)
        {
            continue;
        }
        double delta = sqrt(r * r - y * y);
        range[i] = std::make_pair(x - delta, x + delta);
    }
    if (flag)
    {
        std::sort(range.begin(), range.end(), [](const std::pair<double, double>& a, const std::pair<double, double>& b)->bool
            {
                if (a.second == b.second)
                {
                    return a.first < b.first;
                }
                return a.second < b.second;
            });
        double endPoint = range.begin()->second;
        for (int i = 0; i < n; i++)
        {
            if (range[i].first > endPoint)
            {
                ans++;
                endPoint = range[i].second;
            }
        }
    }
    printf("%d", flag ? ans : -1);
    return 0;
}