【LA4992】Jungle Outpost(半平面交+二分)
解题思路:
紫书上的里例题。
关键是能把问题转化为求半平面,并且确定删除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(半平面交+二分)相关推荐
- UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)
整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...
- HDU 6617 Enveloping Convex(凸包+半平面交+二分)
首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...
- LA 3890 (半平面交) Most Distant Point from the Sea
题意: 给出一个凸n边形,求多边形内部一点使得该点到边的最小距离最大. 分析: 最小值最大可以用二分. 多边形每条边的左边是一个半平面,将这n个半平面向左移动距离x,则将这个凸多边形缩小了.如果这n个 ...
- [凸多边形最大内切圆][半平面交]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 ...
- 【JZOJ3622】【BOI2011】2circles (半平面交+旋转卡壳)
Problem 我们将会研究一个有N 个顶点的凸多边形.我们希望找到一个最大的半径R,使得两个半径为R 的圆能完全地放置在给出的多边形内,并没有重叠. Input 输入的第一行包含一个整数N.接下来N ...
- bzoj 2732 射箭 半平面交 解题报告
Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...
- POJ 1474 Video Surveillance(半平面交)
题意:半平面交求多边形内核(我明明及的我之前是会用kuangbin第一份版平面交的,现在怎么就不会用了呢,补第二份代码) 代码: #include<cstdio> #include< ...
- LA 2218 (半平面交) Triathlon
题意: 有n个选手,铁人三项有连续的三段,对于每段场地选手i分别以vi, ui 和 wi匀速通过. 对于每个选手,问能否通过调整每种赛道的长度使得他成为冠军(不能并列). 分析: 粗一看,这不像一道计 ...
- POJ3335(半平面交)
POJ3335 半平面交裸题 //poj3335 #include <cstdio> #include <cmath> #include <algorithm> # ...
- [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: ...
最新文章
- 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)
- HTML5中引入JS
- ZOJ 3633 rmq 重点在于转化
- Java中TreeMap和TreeSet的底层实现
- 服务器响应HTTP的类型ContentType大全
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
- 语言 micropython_【雕爷学编程】MicroPython动手做(03)——零基础学MaixPy之开机测试...
- IT项目管理之系统验收
- HRBUST 1212 乘积最大
- 市面上哪款输入法最好用,对比出结论
- 计算机安全模式快捷键,windows7怎么进入安全模式(快捷键进入的方法)
- 解决PHP项目显示“该网页无法正常运作”,但没有显示报错内容
- PCA(主成分分析法)的理解笔记及算法的实现
- 万物Linux皆可刷安卓,万物皆可Win,开发者成功在安卓手机刷入Win10系统
- PowerBuilder 部署iis报错:IIS is not acessblee Please check the server address and port number.
- 如何做好实施前准备?
- 软件性能测试 容量测试,性能测试容量计算方法
- 编译原理-第一章-引论
- 无人机领域重大进展,即将实现空中充电
- Ubuntu上,tftpd-hpa 启动失败的解决方法.
热门文章
- 五种食物可以吃掉黑眼圈
- memcpy( )函数复制二维数组 memcmp( )函数比较二维数组
- 【java与智能设备】01_1Android简介与环境搭建
- 期末总结(第五章—)
- mysql+修改数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)
- 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统-计算机系统应用.PDF...
- python functiontools_Python: Tools
- 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
- i386 Linux 系统调用
- 多线程之volatile关键字