解题思路:

紫书上的里例题。

关键是能把问题转化为求半平面,并且确定删除x点是连续删除的,且不确定具体删除的是哪x个点,所以需要判断每x个点组成的凸多边形的半平面交是否为空,这个半平面交就可以安放总部的区域。因为x的值不确定,可以0-n二分判定,注意二分的写法!输入的点是顺时针的,要转为逆时针!

代码:

代码re了。。我不想改了。。等会再改

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int maxn = 5e4+10;
struct Point
{double x,y;Point(double x=0, double  y=0):x(x),y(y){}
};
typedef Point Vector;
int dcmp(double x)
{if(fabs(x) < eps) return 0;else return x > 0 ? 1 : -1;
}
Vector operator + (Vector a, Vector b)//向量加法
{return Vector(a.x + b.x, a.y + b.y);
}
Vector operator - (Vector a, Vector b)//向量减法
{return Vector(a.x - b.x, a.y - b.y);
}
Vector operator * (Vector a, double p)//向量数乘
{return Vector(a.x * p, a.y * p);
}
Vector operator / (Vector a, double p)//向量数除
{return Vector(a.x / p, a.y / p);
}
double Cross(Vector a, Vector b)//外积
{return a.x * b.y - a.y * b.x;
}
double Dot(Vector a, Vector b)//点积
{return a.x * b.x + a.y * b.y;
}
double Length(Vector a)//模
{return sqrt(Dot(a, a));
}struct Line{Point p;//直线上任意一点Vector v;//方向向量double ang;//极角Line(){}Line(Point p, Vector v):p(p),v(v){ang = atan2(v.y,v.x);}friend bool operator < (Line a, Line b){return a.ang < b.ang;}
};
bool OnLeft(Line L, Point p)
{return dcmp(Cross(L.v, p-L.p)) > 0 || dcmp(Cross(L.v, p-L.p)) == 0;
}
Point GetIntersection(Line a, Line b)
{Vector u = a.p-b.p;double t = Cross(b.v,u)/Cross(a.v,b.v);return a.p+a.v*t;
}
int HalfplaneIntersection(Line *L, int n, Point * poly)
{sort(L, L+n);//按极角排序int first, last;//指向双端队列的第一个元素和最后一个元素Point *p = new Point[n];//p[i]为q[i]和q[i+1]的交点Line *q = new Line[n];//双端队列q[first=last=0] = L[0];for(int i = 1; i < n; i++){while(first < last && !OnLeft(L[i], p[last-1])) last--;while(first < last && !OnLeft(L[i], p[first])) first++;q[++last] = L[i];if(fabs(Cross(q[last].v,q[last-1].v)) < eps)//两向量平行且同向,取内侧的一个{last--;if(OnLeft(q[last],L[i].p)) q[last] = L[i];}if(first < last) p[last-1] = GetIntersection(q[last-1],q[last]);}while(first < last && !OnLeft(q[first], p[last-1])) last--;//删除无用平面if(last - first <= 1) return 0;p[last] =GetIntersection(q[last], q[first]);//首位半平面的交点int m = 0;for(int i = first; i <= last; i++) poly[m++] = p[i];return m;}
Point p[maxn], poly[maxn];//p存输入的点, poly存半平面交上的点
Line L[maxn];
int  n;
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d", &n)){if(n == 0) break;for(int i = n-1; i >= 0; i--) scanf("%lf %lf", &p[i].x, &p[i].y);//顺时针给出点int l = 0, r = n;while(l < r){int mid = (l+r) >> 1;int num = 0;for(int i = 0; i < n; i++)L[num++] = Line(p[i], p[(i+mid+1)%n]-p[i]);int m = HalfplaneIntersection(L, num, poly);if(m == 0) r = mid;else l = mid+1;}printf("%d\n", l);}return 0;
}

【LA4992】Jungle Outpost(半平面交+二分)相关推荐

  1. UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)

    整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...

  2. HDU 6617 Enveloping Convex(凸包+半平面交+二分)

    首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...

  3. LA 3890 (半平面交) Most Distant Point from the Sea

    题意: 给出一个凸n边形,求多边形内部一点使得该点到边的最小距离最大. 分析: 最小值最大可以用二分. 多边形每条边的左边是一个半平面,将这n个半平面向左移动距离x,则将这个凸多边形缩小了.如果这n个 ...

  4. [凸多边形最大内切圆][半平面交]Most Distant Point from the Sea POJ3525

    The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is na ...

  5. 【JZOJ3622】【BOI2011】2circles (半平面交+旋转卡壳)

    Problem 我们将会研究一个有N 个顶点的凸多边形.我们希望找到一个最大的半径R,使得两个半径为R 的圆能完全地放置在给出的多边形内,并没有重叠. Input 输入的第一行包含一个整数N.接下来N ...

  6. bzoj 2732 射箭 半平面交 解题报告

    Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...

  7. POJ 1474 Video Surveillance(半平面交)

    题意:半平面交求多边形内核(我明明及的我之前是会用kuangbin第一份版平面交的,现在怎么就不会用了呢,补第二份代码) 代码: #include<cstdio> #include< ...

  8. LA 2218 (半平面交) Triathlon

    题意: 有n个选手,铁人三项有连续的三段,对于每段场地选手i分别以vi, ui 和 wi匀速通过. 对于每个选手,问能否通过调整每种赛道的长度使得他成为冠军(不能并列). 分析: 粗一看,这不像一道计 ...

  9. POJ3335(半平面交)

    POJ3335 半平面交裸题 //poj3335 #include <cstdio> #include <cmath> #include <algorithm> # ...

  10. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.     例如,对于直线:   ...

最新文章

  1. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)
  2. HTML5中引入JS
  3. ZOJ 3633 rmq 重点在于转化
  4. Java中TreeMap和TreeSet的底层实现
  5. 服务器响应HTTP的类型ContentType大全
  6. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
  7. 语言 micropython_【雕爷学编程】MicroPython动手做(03)——零基础学MaixPy之开机测试...
  8. IT项目管理之系统验收
  9. HRBUST 1212 乘积最大
  10. 市面上哪款输入法最好用,对比出结论
  11. 计算机安全模式快捷键,windows7怎么进入安全模式(快捷键进入的方法)
  12. 解决PHP项目显示“该网页无法正常运作”,但没有显示报错内容
  13. PCA(主成分分析法)的理解笔记及算法的实现
  14. 万物Linux皆可刷安卓,万物皆可Win,开发者成功在安卓手机刷入Win10系统
  15. PowerBuilder 部署iis报错:IIS is not acessblee Please check the server address and port number.
  16. 如何做好实施前准备?
  17. 软件性能测试 容量测试,性能测试容量计算方法
  18. 编译原理-第一章-引论
  19. 无人机领域重大进展,即将实现空中充电
  20. Ubuntu上,tftpd-hpa 启动失败的解决方法.

热门文章

  1. 五种食物可以吃掉黑眼圈
  2. memcpy( )函数复制二维数组 memcmp( )函数比较二维数组
  3. 【java与智能设备】01_1Android简介与环境搭建
  4. 期末总结(第五章—)
  5. mysql+修改数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)
  6. 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统-计算机系统应用.PDF...
  7. python functiontools_Python: Tools
  8. 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
  9. i386 Linux 系统调用
  10. 多线程之volatile关键字