【BZOJ1007】[HNOI2008]水平可见直线【半平面交】

【题目链接】

学习一发计算几何基础。

/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

typedef double DB;

const int maxn = 50005;
const DB eps = 1e-6;

struct _line {
	DB k, b;
	int id;
} l[maxn];

int n, sta[maxn], top;

inline bool cmp(_line x, _line y) {
	return fabs(x.k - y.k) < eps ? x.b < y.b : x.k < y.k;
}

inline bool cmp2(int x, int y) {
	return l[x].id < l[y].id;
}

inline DB cosp(_line x, _line y) {
	return (x.b - y.b) / (y.k - x.k);
}

inline void insert(int id) {
	while(top) {
		if(fabs(l[sta[top]].k - l[id].k) < eps) top--;
		else if(top > 1 && cosp(l[id], l[sta[top - 1]]) <= cosp(l[sta[top]], l[sta[top - 1]])) top--;
		else break;
	}
	sta[++top] = id;
}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%lf%lf", &l[i].k, &l[i].b), l[i].id = i;

	sort(l + 1, l + 1 + n, cmp);

	top = 0;
	for(int i = 1; i <= n; i++) insert(i);
	sort(sta + 1, sta + 1 + top, cmp2);
	for(int i = 1; i <= top; i++) printf("%d ", l[sta[i]].id);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值