uva1475 Jungle Outpost
来源:互联网 发布:淘宝代评职称是真的吗 编辑:程序博客网 时间:2024/05/22 09:03
注意到我们并不需要知道总部到底建在哪,只需要求出至少删掉的点数就可以了。
因此可以二分答案,删掉的一定是一段连续的点,于是总共有
因为得到的这些直线是有序的,并不需要每次额外排序,复杂度可以做到
#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=200010;const double eps=1e-8;int cmp(double x){ if (x>eps) return 1; if (fabs(x)<=eps) return 0; return -1;}struct Vector{ double x,y; Vector operator + (const Vector &v) const { return (Vector){x+v.x,y+v.y}; } Vector operator - (const Vector &v) const { return (Vector){x-v.x,y-v.y}; } Vector operator * (const double &k) const { return (Vector){x*k,y*k}; } double ang() const { return atan2(y,x); }}a[maxn],p[maxn];typedef Vector Point;double dot(Vector v,Vector u){ return v.x*u.x+v.y*u.y;}double cross(Vector v,Vector u){ return v.x*u.y-v.y*u.x;}struct Line{ Point p; Vector v; bool operator < (const Line &l) const { return cmp(v.ang()-l.v.ang())==-1; }}f[maxn],t[maxn],que[maxn];bool onleft(Point p,Line l){ return cmp(cross(l.v,p-l.p))==1;}Point intersection(Line l1,Line l2){ Vector v=l1.p-l2.p; double t=cross(l2.v,v)/cross(l1.v,l2.v); return l1.p+l1.v*t;}int n;int ok(int k){ int hd,tl,x; for (int i=1;i<=n;i++) t[i]=(Line){a[i+k+1],a[i]-a[i+k+1]}; for (int i=n+1;i<=2*n;i++) t[i]=t[i-n]; x=n+1; for (int i=n+2;i<=2*n;i++) if (t[i]<t[x]) x=i; for (int i=1;i<=n;i++) f[i]=t[x-i+1]; que[hd=tl=1]=f[1]; for (int i=2;i<=n;i++) { while (hd<tl&&!onleft(p[tl-1],f[i])) tl--; while (hd<tl&&!onleft(p[hd],f[i])) hd++; if (!(que[tl]<f[i])&&!(f[i]<que[tl])) { if (!onleft(p[tl-1],f[i])) que[tl]=f[i]; } else que[++tl]=f[i]; if (hd<tl) p[tl-1]=intersection(que[tl-1],que[tl]); } while (hd<tl&&!onleft(p[tl-1],que[hd])) tl--; return tl-hd<=1;}void solve(){ int l,r,mid; for (int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); for (int i=n+1;i<=2*n+1;i++) a[i]=a[i-n]; l=1,r=n; while (l<r) { mid=(l+r)/2; if (ok(mid)) r=mid; else l=mid+1; } printf("%d\n",l);}int main(){ //freopen("b.in","r",stdin); while (scanf("%d",&n)==1) solve();}
阅读全文
0 0
- uva1475 Jungle Outpost
- LA4992 Jungle Outpost 半平面交
- LA 4992 Jungle Outpost 半平面交 -
- HDU 3761 Jungle Outpost(二分+半平面交)
- LA 4492 Jungle Outpost 半平面交,二分答案
- 【二分+半平面交】 HDOJ 3761 Jungle Outpost
- UVA 1475 Jungle Outpost(二分+半平面交)
- uva 1475 - Jungle Outpost(二分+平面相交)
- UVA 1475 - Jungle Outpost(二分 + 半平面交)
- POJ 3968|UVALive 4992|HDU 3761|UVA 1475|Jungle Outpost|二分|半平面交
- Outpost Firewall 莫尼卡
- outpost pro 7.0注册码
- Outpost Firewall Pro
- OmegacmLabs: “Firewalls. Outpost Firewall Pro
- Outpost防火墙配置技巧四则
- Jungle Roads
- Jungle Roads
- Jungle Roads
- 小M开发_jsp_Servlet_day170704
- vue如何处理返回数据,再进行分类展示
- 如何用 Python 和机器学习帮你决策?
- 糊糊的前端学习笔记——如何将文本行数确定为固定行,并将多余部分用省略号表示【Day04】
- springBoot,Idea 整合redisCluster
- uva1475 Jungle Outpost
- 小printf的故事:什么是真正的程序员?
- MySQL分区按日期
- Gradle实现多渠道OEM打包
- Java数据结构Collection、Set,List,Map
- Java中的多线程你只要看这一篇就够了
- CentOS6.5升级git
- Kubernetes学习笔记(1):Allocatable资源
- c++ 数制转换 一个十进制的数变十几进制的和几进制的数