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

传送门

题意

小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏。

操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号。

现在小凸随机站在操场中的某个位置,标记为 $ P $ 点。将 $ P $ 点与 $ n $ 个顶点各连一条边,形成 $ n $ 个三角形。如果这时 $ (P, P_0, P_1) $ 形成的三角形的面积是 $ n $ 个三角形中最小的一个,小凸则认为这是一次正确站位。

现在小凸想知道他一次站位正确的概率是多少。

题解

对于一次正确站位 $ P $ 来说,要满足两个条件:

  1. $ area(P, P_0. P_1) < area(P, P_i, P_{i+1}) \quad (1 \leq i \lt n-1) $,其中 $ area $ 表示三角形面积。
  2. $ P $ 在多边形内部。

对于条件1来说,将面积转化成叉积形式:
\[ \overrightarrow{PP_0} \times \overrightarrow{PP_1} < \overrightarrow{PP_i} \times \overrightarrow{PP_{i+1}} \quad (1 \leq i \lt n-1) \]
然后再将向量拆开,整理得:
\[ (-y_1+y_0+y_{i+1}-y_i)x + (-x_0+x_1+x_i-x_{i+1})y + (x_0y_1-x_1y_0-x_iy_{i+1}+x_{i+1}y_i) < 0 \]
这样就得到了 $ n $ 个以一般式 $ Ax+By+C<0 $ 的形式表示的半平面。

另外对于条件2来说,也是 $ n-1 $ 个半平面。

所以总共就有了 $ 2n-1 $ 个半平面,跑一边半平面交,就求出了正确站位的总面积 $ S_{right} $ 。

设凸多边形的面积为 $ S $ ,则答案就是 $ \dfrac{S_{right}}{S} $ 。

AC Code

#include 
#include 
#include 
#include 
#include 
#define MAX_N 200005
#define EPS 1e-10
#define eq(x,y) (fabs((x)-(y))0;
    }
};

int n,tot=0,cnt=0;
double sum=0,ans=0;
Coor p[MAX_N];
Coor a[MAX_N];
Line l[MAX_N];
Line q[MAX_N];

void read()
{
    scanf("%d",&n);
    for(int i=0;i

转载于:https://www.cnblogs.com/Leohh/p/9195384.html

你可能感兴趣的:(数据结构与算法)