UVaLive4992:Jungle Outpost
半平面交。
首先,由显然成立法可以证明炸连续的几个总比分散火力效果更佳。
所以二分答案,转化为判定问题,即间隔$ans$个点的连线的半平面交是否为空。
半平面交判定即可。
时间复杂度:$O(Nlog^2N)$
//UVaLive4992 //by Cydiater //2017.2.1 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <ctime> #include <cstdlib> #include <queue> #include <map> #include <algorithm> #include <iomanip> #include <bitset> #include <set> #include <vector> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) #define db double #define Vector Point const int MAXN=1e5+5; const int oo=0x3f3f3f3f; const db eps=1e-10; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int dcmp(db x){if(fabs(x)<eps)return 0;else return x<0?-1:1;} struct Point{ db x,y; Point(db x=0,db y=0):x(x),y(y){} }; Vector operator + (Point x,Point y){return Vector(x.x+y.x,x.y+y.y);} Vector operator - (Point x,Point y){return Vector(x.x-y.x,x.y-y.y);} Vector operator * (Vector x,db p){return Vector(x.x*p,x.y*p);} Vector operator / (Vector x,db p){return Vector(x.x/p,x.y/p);} bool operator < (const Vector &x,const Vector &y){return dcmp(x.x-y.x)==0?x.y<y.y:x.x<y.x;} bool operator == (const Vector &x,const Vector &y){return dcmp(x.x-y.x)==0&&dcmp(x.y-y.y)==0;} struct Line{ Point P; Vector v; db ang; Line(){} Line(Point P,Vector v):P(P),v(v){ang=atan2(v.y,v.x);} }; bool operator < (const Line &x,const Line &y){return x.ang<y.ang;} Point V[MAXN],P[MAXN]; int N,top,head,tail; Line L[MAXN],q[MAXN]; namespace solution{ Point Write(){db x=read(),y=read();return Point(x,y);} db Cross(Vector x,Vector y){return x.x*y.y-x.y*y.x;} bool Onleft(Point P,Line Li){return dcmp(Cross(P-Li.P,Li.v))<0;} void Prepare(){ V[0]=Write(); down(i,N-1,1)V[i]=Write(); } void Modify(int siz){ up(i,0,N-1)L[i]=Line(V[i],V[(i+siz)%N]-V[i]); } Point LineMeet(Line x,Line y){ db t=Cross(y.v,x.P-y.P)/Cross(x.v,y.v); return x.P+x.v*t; } bool check(){ head=1;tail=0;q[++tail]=L[0]; up(i,1,N-1){ while(head<tail&&!Onleft(P[tail-1],L[i]))tail--; while(head<tail&&!Onleft(P[head],L[i]))head++; q[++tail]=L[i]; if(dcmp(q[tail-1].ang-q[tail].ang)==0){ tail--; if(Onleft(L[i].P,q[tail]))q[tail]=L[i]; } if(head<tail)P[tail-1]=LineMeet(q[tail-1],q[tail]); } while(head<tail&&!Onleft(P[tail-1],q[head]))tail--; return tail-head>1; } void Solve(){ int leftt=0,rightt=N-1,mid; while(leftt+1<rightt){ mid=(leftt+rightt)>>1; Modify(mid); if(check()) leftt=mid; else rightt=mid; } Modify(rightt); if(check()) cout<<rightt<<endl; else cout<<leftt<<endl; } } int main(){ //freopen("input.in","r",stdin); using namespace solution; while(scanf("%d",&N)!=EOF){ Prepare(); Solve(); } return 0; }
UVaLive4992:Jungle Outpost的更多相关文章
- LA 4992 Jungle Outpost(半平面交)
Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...
- UVALive 4992 Jungle Outpost(半平面交判存)
Jungle Outpost Time limit: 15.000 seconds Description There is a military base lost deep in the jung ...
- 【二分】【半平面交】Gym - 101309J - Jungle Outpost
发现炸毁的瞭望塔必然是连续的,其余下的部分是一个半平面. 二分答案,枚举所有可能的炸毁情况,做个半平面交,如果交出来面积是0,就可以保证不存在安全区域. #include<cstdio> ...
- UVa 1475 (二分+半平面交) Jungle Outpost
题意: 有n个瞭望塔构成一个凸n边形,敌人会炸毁一些瞭望台,剩下的瞭望台构成新的凸包.在凸多边形内部选择一个点作为总部,使得敌人需要炸毁的瞭望塔最多才能使总部暴露出来.输出敌人需要炸毁的数目. 分析: ...
- uvalive 4992 Jungle Outpost
题意:一个凸边型,目标在凸边型内且最优.问最多删除几个点使目标暴露在新凸边型外面. 思路:二分+半平面相交. #include<cstdio> #include<cmath> ...
- uva 1475 - Jungle Outpost
半平面交,二分: 注意,题目的点是顺时针给出的: #include<cstdio> #include<algorithm> #include<cmath> #def ...
- UVALive 4992 Jungle Outpost(半平面交)
题意:给你n个塔(点)形成一个顺时针的凸包,敌人可以摧毁任何塔,摧毁后剩下的塔再组成凸包 在开始的凸包内选一点为主塔,保证敌人摧毁尽量多塔时主塔都还在现在的凸包内,求出最多摧毁的塔 题解:这题关键就是 ...
- bzoj千题计划210:bzoj2642 | Poj3968 | UVALive 4992| hdu 3761 Jungle Outpost
http://www.lydsy.com/JudgeOnline/problem.php?id=2642 题意: n个瞭望台,形成一个凸n边形.这些瞭望台的保护范围是这个凸包内的任意点. 敌人进攻时, ...
- [GodLove]Wine93 Tarining Round #10
比赛链接: http://www.bnuoj.com/v3/contest_show.php?cid=4159 题目来源: lrj训练指南---几何算法 Flag ID Title A Board ...
随机推荐
- Java的String详解
Java的String详解 博客分类: Java javaStringString详解常用方法 Java的String类在开发时经常都会被使用到,由此可见String的重要性.经过这次认真仔细的学习 ...
- Android Activity与Fragment生命周期 对应关系
- 2012Noip提高组Day1 T3 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- video事件
/** video播放器*/ * @ src: 指定所要嵌入视频.文档的URL. * @ poster: 视频预览图像 * @ autoplay: 视频自动播放 * @ loop: 循环播放 * @ ...
- saltstack之syndic的配置
author: headsen chen date: 2018-08-04 22:22:09 1,架构 2,配置 2.1,配置master: yum -y install epel-relea ...
- MariaDB快速选择最适合您的需要的存储引擎
1.Xtradb和InnoDB是一个很好的通用事物存储引擎.通常不确定选用何种存储引擎时,Xtradb和InnoDB是最佳的选择. 2.MyISAM和Aria,占用空间小,系统之间容易复制.MyISA ...
- js获取当前域名
<script language="javascript"> //获取域名 host = window.location.host; host2=document.do ...
- c#中类和对象详解
1.1 类和对象 类 (class) 是最基础的 C# 类型.类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中.类为动态创建的类实例 (instance) 提供了定义,实例 ...
- Gunicorn独角兽
1. 关于Gunicorn Gunicorn是一个开源的Python WSGI HTTP服务器,移植于Ruby的Unicorn项目的采用pre-fork模式的服务器.Gunicorn服务器可与各种We ...
- android(十五) FTP的两种工作模式
(一)PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链 当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我打开了 ...