题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小

用叉积来求:

\(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积)

\((p_p-i)\times (p_p-p_{i+1})\Rightarrow\)

\((x_p-x_i,y_p-y_i)\times(x_p-x_{i+1},y_p-y_{i+1})\Rightarrow\)

\((x_p-x_i)(y_p-y_{i+1})-(y_p-y_i)(x_p-x_{i+1})\Rightarrow\)

\(x_py_p-x_py_{i+1}-x_iy_p+x_iy_{i+1}-x_py_p+x_{i+1}y_p+x_py_i-x_{i+1}y_i\Rightarrow\)

\(x_p(y_i-y_{i+1})+y_p(x_{i+1}-x_i)+(x_iy_{i+1}-x_{i+1}y_i)\)

要求点\(p\)和点\(0,1\)组成的三角形面积最小,即:

\(x_p(y_0-y_1)+y_p(x_1-x_0)+(x_0y_1-x_1y_0)<x_p(y_i-y_{i+1})+y_p(x_{i+1}-x_i)+(x_iy_{i+1}-x_{i+1}y_i)\Rightarrow\)

\(x_p(y_0-y_1-y_i+y_{i+1})+y_p(x_1-x_0-x_{i+1}+x_i)+(x_0y_1-x_1y_0-x_iy_{i+1}+x_{i+1}y_i)<0\)

可以发现,方程为\(ax+by+c<0\)的形式,可以求出\(n\)个方程,和原凸多边形求一下半平面交,交出来的面积与原多边形面积的比值即为答案

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<bitset>
#include<sstream>
#include<cstdlib>
#define QAQ int
#define TAT long long
#define OwO bool
#define ORZ double
#define Ug unsigned
#define F(i,j,n) for(QAQ i=j;i<=n;++i)
#define E(i,j,n) for(QAQ i=j;i>=n;--i)
#define MES(i,j) memset(i,j,sizeof(i))
#define MEC(i,j) memcpy(i,j,sizeof(j)) using namespace std;
const QAQ N=300005;
const ORZ eps=1e-8;
QAQ sign(ORZ x){return fabs(x)<=eps ? 0 : (x>0 ? 1 : -1);} QAQ n;
struct Point {
ORZ x,y;
Point(){}
Point(ORZ X,ORZ Y){x=X;y=Y;} friend Point operator + (Point a,Point b){
return Point(a.x+b.x,a.y+b.y);
}
friend Point operator - (Point a,Point b){
return Point(a.x-b.x,a.y-b.y);
}
friend Point operator * (Point a,ORZ k){
return Point(a.x*k,a.y*k);
}
friend ORZ operator * (Point a,Point b){
return a.x*b.x+a.y*b.y;
}
friend ORZ operator ^ (Point a,Point b){
return a.x*b.y-a.y*b.x;
}
}p[N];
struct Line{
Point p,v;
ORZ poa; Line(){}
Line(Point a,Point b){
p=a;v=b;
poa=atan2(b.y,b.x);
}
friend OwO operator < (Line a,Line b){
return sign(a.poa-b.poa)==0 ? sign((a.v) ^ (b.p-a.p)) >0 : sign(a.poa-b.poa)<0;
}
}a[N],q[N];
QAQ js,head,tail,cnt;
ORZ s1,s2; Point inter(Line a,Line b){
Point u=a.p-b.p;
ORZ k=(b.v^u)/(a.v^b.v);
return a.p+a.v*k;
} OwO pd(Line a,Point b){
return sign(a.v^(b-a.p))>=0;
} void Half_Plane(){
sort(a+1,a+js+1);
cnt=1;
F(i,2,js) if(sign(a[i].poa-a[cnt].poa)>0) a[++cnt]=a[i];
head=1;tail=0;
q[++tail]=a[1];q[++tail]=a[2];
F(i,3,cnt){
while(head<tail&&pd(a[i],inter(q[tail-1],q[tail]))) tail--;
while(head<tail&&pd(a[i],inter(q[head+1],q[head]))) head++;
q[++tail]=a[i];
}
while(head<tail&&pd(q[head],inter(q[tail-1],q[tail]))) tail--;
F(i,head,tail-1) p[i]=inter(q[i],q[i+1]);
p[tail]=inter(q[tail],q[head]);
F(i,head,tail-1) s2+=(p[i]^(p[i+1]-p[i]));
s2+=(p[tail]^(p[head]-p[tail]));
} QAQ main(){
scanf("%d",&n);
F(i,0,n-1) scanf("%lf%lf",&p[i].x,&p[i].y);
p[n]=p[0];
F(i,0,n-1) {
a[++js]=Line(p[i+1],p[i]-p[i+1]);
s1+=(p[i]^(p[i+1]-p[i]));
}
F(i,1,n-1){
ORZ A=p[i+1].x-p[i].x-p[1].x+p[0].x;
ORZ B=p[i+1].y-p[i].y-p[1].y+p[0].y;
ORZ C=-(p[i]^(p[i+1]-p[i]))+(p[0]^(p[1]-p[0]));
if(sign(A)!=0) a[++js]=Line(Point(0,C/A),Point(-A,-B));
else if(sign(B)!=0) a[++js]=Line(Point(-C/B,0),Point(0,-B));
}
Half_Plane();
printf("%.4lf\n",fabs(s2/s1));
return 0;
}

[bzoj4445] [SCOI2015]小凸想跑步 (半平面交)的更多相关文章

  1. 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交

    [BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...

  2. 4445: [Scoi2015]小凸想跑步 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...

  3. bzoj 4445 小凸想跑步 - 半平面交

    题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...

  4. BZOJ4445: [Scoi2015]小凸想跑步

    裸半平面交. 记得把P0P1表示的半平面加进去,否则点可能在多边形外. #include<bits/stdc++.h> #define N 100009 using namespace s ...

  5. BZOJ4445 SCOI2015小凸想跑步(半平面交)

    考虑怎样的点满足条件.设其为(xp,yp),则要满足(x0-xp,y0-yp)×(x1-xp,y1-yp)<=(xi-xp,yi-yp)×(xi+1-xp,yi+1-yp)对任意i成立.拆开式子 ...

  6. 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)

    传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...

  7. 【BZOJ4445】[SCOI2015]小凸想跑步(半平面交)

    [BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...

  8. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

  9. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

随机推荐

  1. 混合开发之DSBridge(同时支持Android和iOS)

    什么是 Javascript bridge 随着h5的不断普及及优化,以及移动端对动态化的需求越来越大,开发者经常需要在app中嵌入一些网页,然后会在web和native之间进行交互,如传递数据,调用 ...

  2. 5-SOM神经网络

    https://blog.csdn.net/gavinlyy/article/details/8302814 https://blog.csdn.net/u011314012/article/deta ...

  3. 基于jquery的ajax方法封装

    在实际的项目里,ajax的应用频率很高,所以尽管jquery或者其他的一些类似的js库做了非常不错的封装,仍然有进一步封装简化的空间和必要 举一个例子,很久很久以前,我的ajax是这么写的: $.aj ...

  4. unary_function和binary_function详解

    1.unary_function和binary_function介绍 1.1 unary_function介绍 unary_function可以作为一个一元函数对象的基类,它只定义了参数和返回值的类型 ...

  5. [Training Video - 6] [File Reading] [Java] Read Excel File Using Apache POI API

    读取以下两种格式的Excel : *.xls  and *.xlsx 用Apache POI API来实现,需要用到 HSSF 和 XSSF 的类库 HSSF is the POI Project's ...

  6. understand的安装

    1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...

  7. gradle创建spring-boot项目

    刚来新公司,熟悉了公司项目搭建的框架,了解到了一种新的项目管理工具:gradle,从网上了解,据说比maven更加灵活化,于是便学习了一番.在此记录下来,一遍以后使用.gradle的安装就不说了,网上 ...

  8. 搜狐 WEB 标准-前端技术应用规范

  9. Firefox 43无法安装xpi的问题

    Firefox 43无法安装xpi的问题 说明:Firefox 42将默认禁止安装未签名扩展   强制禁用这个首选项(高级用户): 你可以在 Firefox 配置编辑页面 (about:config ...

  10. C# 单例模式(Singleton)

    摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要 ...