【题目链接】
【思路要点】
- 将直线按斜率排序,用单调栈维护半平面交。
- 注意有关实数运算EPS的问题。
- 时间复杂度\(O(NLogN)\)。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100005 #define EPS 1e-6 struct line {double k, b; }; struct info {line l; int num; }; info a[MAXN]; int n, top, q[MAXN]; bool ans[MAXN]; double getx(line x, line y) { return (y.b - x.b) / (x.k - y.k); } bool cmp(info a, info b) { if (a.l.k < b.l.k) return true; if (a.l.k > b.l.k) return false; return a.l.b > b.l.b; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lf%lf", &a[i].l.k, &a[i].l.b); a[i].num = i; } sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; i++) { if (i != 1 && a[i].l.k == a[i - 1].l.k) continue; while (top >= 2 && getx(a[i].l, a[q[top - 1]].l) < getx(a[q[top]].l, a[q[top - 1]].l) + EPS) top--; q[++top] = i; } for (int i = 1; i <= top; i++) ans[a[q[i]].num] = true; for (int i = 1; i <= n; i++) if (ans[i]) printf("%d ", i); return 0; }