把左断点小于end的都便利一遍,选择区间延伸最长的,然后开始新的左断点开始遍历。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/10/3.
// Mail:1016427040@qq.com or jasonshaosjj@gmail.com
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
struct node{
double ra,rb;
bool operator < (const node &rhs) const {
return ra<rhs.ra;
}
};
vector<node> v;
int main()
{
int n,l;
double w;
while(cin>>n>>l>>w)
{
v.clear();
double li=(double)l;
double wi=w/2.0;
for(int i=0;i<n;i++)
{
int p,r;
scanf("%d%d",&p,&r);
if(r<=wi) continue;
double ex=sqrt((double)r*r-wi*wi);
if(p-ex>li) continue;
v.push_back((node){(double)p-ex,(double)p+ex});
}
sort(v.begin(),v.end());
int i,j,ncount=0;
double end=0.0;
for(i=0;i<v.size();i=j)
{
if(v[i].ra>end) break;
for(j=i+1;j<v.size()&&v[j].ra<=end;j++)
if(v[i].rb<v[j].rb) {i=j;}
end=v[i].rb;ncount++;
if(end>=li) break;
}
if(end>=l) cout<<ncount<<endl;
else cout<<-1<<endl;
}
return 0;
}