【BZOJ3707】圈地

Description

2维平面上有n个木桩,黄学长有一次圈地的机会并得到圈到的土地,为了体现他的高风亮节,他要使他圈到的土地面积尽量小。圈地需要圈一个至少3个点的多边形,多边形的顶点就是一个木桩,圈得的土地就是这个多边形内部的土地。(因为黄学长非常的神,所以他允许圈出的第n点共线,那样面积算0)

Input

第一行一个整数n,表示木桩个数。
接下来n行,每行2个整数表示一个木桩的坐标,坐标两两不同。

Output

仅一行,表示最小圈得的土地面积,保留2位小数。

Sample Input

3
0 0
0 1
1 0

Sample Output

0.50

HINT

对于100%的数据,n<=1000。

题解:假如我们已经确定了三角形的一条边,那么面积可以表示成 边长*高/2,如果我们将所选的边当做y轴,那么显然第3个点应取|x|最小的点。问题是如何快速确定|x|最小的点。

有一个结论(难想),就是将所有直线按照极角排序(斜率也行),将所有点按y排序(相当于所选的边是x轴),此时所有点距离直线的相对位置是确定的。我们枚举每条直线,当我们从ai,bi枚举到ai+1,bi+1时,只有ai,bi的相对位置发生了改变,其余点的相对位置均不改变。(相对位置指的是以所选直线为y轴后,x的大小关系。这个结论自己画画应该就能理解)

于是我们用桶维护每个点的相对位置即可。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1010;
int n,tot;
int s[maxn],pos[maxn];
double ans;
struct point
{
double x,y;
point () {}
point (double a,double b){x=a,y=b;}
point operator + (const point &a) const {return point(x+a.x,y+a.y);}
point operator - (const point &a) const {return point(x-a.x,y-a.y);}
double operator * (const point &a) const {return x*a.y-y*a.x;}
}p[maxn];
struct line
{
double k;
int a,b;
}l[1000000];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmpy(point a,point b)
{
return a.y<b.y;
}
bool cmpk(line a,line b)
{
return a.k<b.k;
}
void calc(int a,int b,int c)
{
double S=fabs((p[b]-p[a])*(p[c]-p[a])/2);
ans=min(ans,S);
}
int main()
{
n=rd();
int i,j;
for(i=1;i<=n;i++) p[i].x=rd(),p[i].y=rd();
sort(p+1,p+n+1,cmpy);
for(i=1;i<=n;i++) s[i]=pos[i]=i;
for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) l[++tot].k=atan2(p[j].y-p[i].y,p[j].x-p[i].x),l[tot].a=i,l[tot].b=j;
sort(l+1,l+tot+1,cmpk);
ans=999999999;
for(i=1;i<=tot;i++)
{
if(pos[l[i].a]>pos[l[i].b]) swap(l[i].a,l[i].b);
if(pos[l[i].a]>1) calc(s[pos[l[i].a]-1],l[i].a,l[i].b);
if(pos[l[i].b]<n) calc(s[pos[l[i].b]+1],l[i].a,l[i].b);
swap(pos[l[i].a],pos[l[i].b]);
s[pos[l[i].a]]=l[i].a,s[pos[l[i].b]]=l[i].b;
}
printf("%.2lf",ans);
return 0;
}

【BZOJ3707】圈地 几何的更多相关文章

  1. CodeForces - 1019D(BZOJ3707圈地):Large Triangle (几何,找面积为S的三角形)

    题意:给定平面上N个点,问是否存在三角形,其面积为S. 思路:选择Y轴,枚举这个Y轴,面积大小只与|y-Y|有关,然后二分,具体的可以先去做BZOJ3707. 具体的: 1,先对点排序,X坐标为第一关 ...

  2. BZOJ3707 圈地

    只会O(n ^ 3)路过= = OrzOrzOrzOrzOrz "出题人题解: 显然,这时候暴力枚举会T.于是我们转变一下思路,如果我们确定了2个点以后,第三个点有必要去盲目的枚举吗?答案是 ...

  3. AMD的ARM之路前景几何?

    http://server.zdnet.com.cn/all-2129330.html#2129333 AMD将于2014年推出基于ARM架构的Opteron(皓龙)处理器,应该是最近一段时间在IT产 ...

  4. UVA 11646 - Athletics Track || UVA 11817 - Tunnelling the Earth 几何

    题目大意: 两题几何水题. 1.UVA 11646 - Athletics Track 如图,体育场的跑道一圈400米,其中弯道是两段半径相同的圆弧,已知矩形的长宽比例为a:b,求长和宽的具体数值. ...

  5. 关于Three.js基本几何形状之SphereGeometry球体学习

    一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...

  6. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

  7. Python微信-- 分享接口(分享到朋友圈、朋友、空间)

    生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...

  8. BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道

    你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...

  9. WPF 自定义绕圈进度条

    在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...

随机推荐

  1. mysql行转列,单列转多行

    行转列 使用CASE语句: SELECT SUM(CASE USER_NAME='A' THEN KILLS END) AS 'A', SUM(CASE USERNAME='B' THEN KILL ...

  2. hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Objec ...

  3. CentOS7关闭SELinux

    查看 [root@dev-server ~]# getenforce Disabled [root@dev-server ~]# /usr/sbin/sestatus -v SELinux statu ...

  4. 【Hadoop】Hadoop HA 部署 详细过程(架构、机器规划、配置文件、部署步骤)

    1.概念.架构 2.配置文件示例.部署步骤 hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等.最新的hadoop-2.4.1又增加了YARN HA 注意:apac ...

  5. 使用json-server搭建模拟api接口

    转载:http://blog.csdn.net/adojayfan/article/details/55011674 作为前端和客户端开发人员,在后端还没有给出对应的api接口时,我们无法做测试. 这 ...

  6. Android RxJava使用介绍(四) RxJava的操作符

    本篇文章继续介绍下面类型的操作符 Combining Observables(Observable的组合操作符) Error Handling Operators(Observable的错误处理操作符 ...

  7. linux本地文件上传之RZ/SZ和sftp

    将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令. 1.软件安装 (1)编译安装 root 账号登陆后, ...

  8. linux常用命令(个人学习笔记)

    个人说明:学习linux也有半年左右的时间了,从一开始的只会简单的开关机,到现在的熟悉应用一些简单的命令,还是有些进步的,不过对于我这种菜鸟来说,如果不经常用,发现忘的很快.所以就把在学习过程中遇到的 ...

  9. 获取bundle文件下的资源

    NSBundle* bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle].resourcePath stringByAppendingPat ...

  10. CSRF介绍与应对以及Java代码示例

    详细信息看这里:https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 简介 CSRF(Cross Site Request Forg ...