nlogn的做法
查看原帖
nlogn的做法
1101254
Louisdlee楼主2024/3/2 17:58

完全没想到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();
}
2024/3/2 17:58
加载中...