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

原创 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) 

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

半平面交初级

半平面:顾名思义,半平面就是平面的一半,那么半平面应该如何表示呢?我们知道一条直线可以将平面分成两半,如果直线的方程为ax+by+c=0ax+by+c = 0,那么半平面就可以表示为ax+by+c0a...
  • huayunhualuo
  • huayunhualuo
  • 2016年04月15日 20:15
  • 793

计算几何学习之半平面交

首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面。 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为...
  • kep159
  • kep159
  • 2014年04月22日 15:51
  • 983

半平面交总结and模板

这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半平面交还是个挺实用的知识点。 半平面交主要是看的ZZY的国家队论文,他提出的是一种O(n×log(n))的排序增量法。 附论文地址: 算...
  • xuechelingxiao
  • xuechelingxiao
  • 2014年11月06日 16:44
  • 2555

平面点集的凸包

概念:给定一个平面的点集q,求覆盖所有点的最小凸多边形(在多边形边上,或内部)。 主要求解思想: 采用分治算法 如图,先找出y坐标最大和做小的点,并入此多边形的顶点集(因为是y坐标最大和最...
  • u013337743
  • u013337743
  • 2015年07月08日 20:40
  • 1667

三维凸包模板

今天遇到了个3维凸包问题的题,网上找了2个模板。。感谢菊苣们。。不要嫌弃我转载一下下啊。。。orz/*给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面的多边形个数. 增量法求解:首先任选4个点...
  • xtulollipop
  • xtulollipop
  • 2016年08月16日 20:29
  • 520

计算几何中的凸包计算

在学习了一些有关计算机几何的基础知识和一些基本工具之后要快速的解决一些简单的几何问题,如两点之间的距离、两线段的交点个数等等是可以轻松应付的,但是对于复杂点的几何问题,我们还是要有更好的算法,这样才可...
  • guankeliang
  • guankeliang
  • 2016年09月06日 15:31
  • 685

算法学习笔记之计算几何--平面凸包

Introduction凸包(Convex Hull)是计算几何中的一类极其重要的问题,计算几何中的很多问题都可以转化为凸包问题来解决。直观的来讲,凸包就像是在一块钉有若干个钉子的木板上撑开一根橡皮筋...
  • larryshaw0079
  • larryshaw0079
  • 2017年06月28日 11:02
  • 194

poj 3805 Separate Points 判断凸包是否相交,nlogn复杂度

代码: #include #include #include #include #include #include #include #include #include using...
  • a601025382s
  • a601025382s
  • 2014年07月20日 15:39
  • 1536

POJ 2451 nlog(n)半平面交裸题。

Uyuw's Concert Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 6587   ...
  • u012358934
  • u012358934
  • 2014年05月04日 18:44
  • 971

HDU 4316 凸包 +半平面交

题意:给出多边形的顶点,然后在天花板有三个摄像头,找出三个摄像头的盲区。 思路:每一个摄像头 对应有一个盲区,然后把三个摄像头的盲区取交集 然后求面积就可以 这里用到了 凸包模版和半平面交模版 代...
  • S1766434333
  • S1766434333
  • 2017年05月27日 20:12
  • 187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:半平面求交——点在凸包外
举报原因:
原因补充:

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