半平面求交——点在凸包外

原创 2015年11月21日 11:25:39
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50010;
const double EPS = 1e-8;
struct Point
{
	double x, y;
};
Point p[maxn];
struct Line
{
	Point a, b;
};
Line l[maxn], st[maxn];
int n;
double operator *(const Point &x, const Point &y)
{
	return x.x * y.y - x.y * y.x;
}
Point operator - (Point x, const Point &y)
{
	x.x -= y.x, x.y -= y.y;
	return x;
}
Point operator *(const Line &x, const Line &y)
{
	double a1 = (y.b - x.a) * (y.a - x.a), a2 = (y.a - x.b) * (y.b - x.b);
	Point r;
	r.x = (x.a.x * a2 + x.b.x * a1) / (a2 + a1);
	r.y = (x.a.y * a2 + x.b.y * a1) / (a2 + a1);
	return r;
}
bool operator == (const Point &a, const Point &b)
{
	return fabs(a.x - b.x) < EPS && fabs(a.y - b.y) < EPS;
}
bool JudgeOut(const Line &x, const Point &p0)
{
	return (p0 - x.a) * (x.b - x.a) > -EPS;
}
bool Parallel(const Line &x, const Line &y)
{
	return fabs((x.b - x.a) * (y.b - y.a)) < EPS;
}
bool HplaneIntersection(const int &tem)
{
	for (int i = 0; i < n; i++)
		l[i].a = p[i], l[i].b = p[i - 1 - tem + (i - 1 - tem < 0 ? n : 0)];
	int top = 1, bot = 0;
	st[0] = l[0], st[1] = l[1];
	for (int i = 2; i < n; i++)
	{
		if (Parallel(st[top], st[top - 1]) || Parallel(st[bot], st[bot + 1])) return 0;
		while (bot < top && JudgeOut(l[i], st[top]*st[top - 1])) top--;
		while (bot < top && JudgeOut(l[i], st[bot]*st[bot + 1])) bot++;
		st[++top] = l[i];
	}
	while (bot < top && JudgeOut(st[bot], st[top]*st[top - 1])) top--;
	while (bot < top && JudgeOut(st[top], st[bot]*st[bot + 1])) bot++;
	return top > bot + 1;
}
int main(int argc, char const *argv[])
{
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
			scanf("%lf%lf", &p[i].x, &p[i].y);
		int lft = 1, rgt = (n - 1) >> 1, mid;
		while (rgt > lft)
		{
			mid = (lft + rgt) >> 1;
			if (!HplaneIntersection(mid)) rgt = mid;
			else lft = mid + 1;
		}
		printf("%d\n", rgt);
	}
	return 0;
}


丛林深处有军事基地,它被n个瞭望塔保护,这些瞭望塔保护它们构成的凸多边形内部,指挥所可以放置在凸包内部任意地点,问敌人至少需要炸毁多少瞭望塔才能使指挥所失去保护?


对于最多需要炸毁多少瞭望塔,可以用二分的思想转换为判定性问题

设炸毁k个瞭望塔,首先k个瞭望塔肯定是凸包上k个连续的点。

对应指挥部的位置,有n种方法炸毁瞭望塔,每种对应一个半平面,而让指挥部完全暴露,相当于这n个半平面的交为空集;

因为原始点集是有许多的,所以在半平面交是不用每次都排序,时间复杂度可以由O(nLogn2)降为O(nlogN) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 3525 || Most Distant Point from the Sea (凸包求最大内接圆,半平面交内推r

题目在问这样一个问题:给定一个凸多边形,找到其中的一个点,使得其到每条边的距离最小值最大,输出这个距离。 其实就是在问你,这个多边形中最大的一个内切圆有多大。 怎么做呢?如果我们事先知道一...
  • FXXKI
  • FXXKI
  • 2015-05-12 21:08
  • 416

求凸包+旋转卡壳算法——求平面点集S内点对的最远距离

目录 问题:求平面点集S内点对的最远距离... 1 解答:... 1 一.         凸包... 1 二.         旋...

代码备份:动态维护半平面交/凸包

以前写的代码,怕以后找不到了,放在这里安全点。        其实没太多的技术含量,用平衡树维护,配合链表,利用增量算法的思想,注意细节,使劲写就行了。    动态维护半平面交     ...

【凸包】poj 2187 Beauty Contest (旋转卡壳求平面最远点对)

旋转卡壳算法原理讲解:点击打开链接 旋转卡壳算法的使用范围很广,我只学习了求平面最远点对的方法; 旋转卡壳求平面最远点对方法: 如果qa,qb是凸包上最远两点,必然可以分别过qa,qb画出一对平行...

大白 计算几何专题 凸包、半平面交、平面区域 部分例题练习题总结

LA 2797 Monster Trap 1. 姿势,学习学习, 做法就是将每条线段都延长一些些, 然后判断点到点是否可以直接到达再bfs。 2. 最重要的就是避免穿墙, 除了书上讲的情况外,还要排除...

poj 1584(凸包+点在凸多边形内+圆在凸多边形内)

题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包。 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部。 解题思路: ...

UVA 634 || Polygon(转角法,点在凸包内

题目大意:T when P belongs to the polygon or F otherwise  如果点P属于多边形那么输出T,反之输出F。 刚刚入门计算几何。都是自己摸索出来的,如果理解...
  • FXXKI
  • FXXKI
  • 2015-01-24 18:43
  • 690

(beginer) 凸包+点在多边形内 UVA 11072 Points

Points  Time limit: 10s In this problem you will be given a set of points in the Euclidian plane...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)