完全没想到dp,倒是想到了dijkstra
可能出题人没想过在这里卡数据?
设初始MEX(a)=x
那么x可以通向所有1~x-1的点
换句话说,每个点都能通往小于它本身的点。
跑一边dijkstra就行了
#include<bits/stdc++.h>
using namespace std;
struct point {
double x;
long double y;
};
struct point1 {
double begin;
double end;
};
bool cmp(point1 a, point1 b) {
return a.begin < b.begin;
}
void slove() {
int n;
cin >> n;
long double d;
cin >> d;
vector<point> v(n + 1);
vector<point1> s(n + 1);
int bnt = 1;
for (int i = 1; i <= n; i++) {
cin >> v[i].x >> v[i].y;
if (v[i].y > d)continue;
double dx = sqrt(d * d - v[i].y * v[i].y);
s[bnt].begin = v[i].x - dx;
s[bnt].end = v[i].x + dx;
bnt++;
}
sort(s.begin() + 1, s.begin() + 1 + bnt, cmp);
double pos = -1e5;
long double eps = 1e-5;
int cnt = 0;
for (int i = 1; i <= bnt; i++) {
if (s[i].begin > pos) {
cnt++;
pos = s[i].end;
}
else pos = min(pos, s[i].end);
}
if (cnt == 0)cout << -1 << endl;
else cout << cnt << endl;
}
int main() {
slove();
}