裸半平面交。记得把P0P1表示的半平面加进去,否则点可能在多边形外。

#include<algorithm>
#include<cstdio>
#include<cmath>
using std::sort;
typedef double flo;
const int N=1e5+5;
struct vec{flo x,y;}p[N],q2[N];
flo det(vec a,vec b){return a.x*b.y-a.y*b.x;}
vec operator+(vec a,vec b){return(vec){a.x+b.x,a.y+b.y};}
vec operator-(vec a,vec b){return(vec){a.x-b.x,a.y-b.y};}
vec operator*(flo a,vec b){return(vec){a*b.x,a*b.y};}
struct line{
vec p,v;
flo a;
void cal(){a=atan2(v.y,v.x);}
}r[N],q1[N];
flo cal(vec a,line b){return det(a-b.p,b.v);}
bool operator<(line a,line b){return a.a<b.a||a.a==b.a&&cal(a.p,b)<0;}
vec over(line a,line b){
return a.p+det(a.p-b.p,b.v)/det(b.v,a.v)*a.v;
}
void ins(int i,int j){
flo a=p[0].y-p[i].y-p[1].y+p[j].y;
flo b=p[1].x-p[j].x-p[0].x+p[i].x;
flo c=det(p[0],p[1])-det(p[i],p[j]);
r[i].p.x=b?0:-c/a;
r[i].p.y=b?-c/b:0;
r[i].v=(vec){-b,a};
}
flo area(vec*p,int n){
flo s=det(p[n-1],p[0]);
for(int i=1;i<n;++i)
s+=det(p[i-1],p[i]);
return s;
}
int main(){
struct{
operator int(){
int x=0,y=0,c=getchar();
while(c<48)
y=c==45,c=getchar();
while(c>47)
x=x*10+c-48,c=getchar();
return y?-x:x;
}
}it;
int n=it;
for(int i=0;i<n;++i)
p[i].x=it,p[i].y=it;
r[0].p=p[0];
r[0].v=p[1]-p[0];
for(int i=1;i<n;++i)
ins(i,(i+1)%n);
for(int i=0;i<n;++i)
r[i].cal();
sort(r,r+n);
int a=0,b=-1;
for(int i=0;i<n;++i){
while(a<b&&cal(q2[b],r[i])>0)--b;
while(a<b&&cal(q2[a+1],r[i])>0)++a;
if(a>b||r[i].a!=q1[b].a)
q1[++b]=r[i],q2[b]=over(q1[b],q1[b-1]);
}
while(a<b&&cal(q2[b],q1[a])>0)--b;
q2[a]=over(q1[a],q1[b]);
flo s=area(q2+a,b-a+1)/area(p,n);
printf("%.4f\n",s);
}

BZOJ4445: [Scoi2015]小凸想跑步的更多相关文章

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

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

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

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

  3. [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)

    题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...

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

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

  5. 【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) ...

  6. [SCOI2015]小凸想跑步

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

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

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

  8. bzoj 4445 [SCOI2015] 小凸想跑步

    题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率 根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值 #include<bits/stdc++ ...

  9. 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)

    题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...

随机推荐

  1. [BZOJ3144][HNOI2013]切糕(最小割)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3144 分析:神题不解释 http://www.cnblogs.com/zig-zag/ ...

  2. AVL树插入操作实现

    为了提高二插排序树的性能,规定树中的每个节点的左子树和右子树高度差的绝对值不能大于1.为了满足上面的要求需要在插入完成后对树进行调整.下面介绍各个调整方式. 右单旋转 如下图所示,节点A的平衡因子(左 ...

  3. mybatis缓存学习笔记

    mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...

  4. mysql创建触发器

    触发器语句只有一句话 可以省略begin和end CREATE trigger `do_praise` after insert on praise for each row update post ...

  5. 在eclipse下如何安装下载好的插件

    我们下载到的插件,如果是一个jar格式的包,那么我们所需要做的事,就是 第一,新建一个名为plugins的文件夹, 第二,新建一个名为eclipse的文件夹,再将plugins复制进eclipse中, ...

  6. webpack进阶之插件篇

    一.插件篇 1. 自动补全css3前缀 autoprefixer 官方是这样说的:Parse CSS and add vendor prefixes to CSS rules using values ...

  7. 转 -- linux IO子系统和文件系统读写流程

    我们含有分析的,是基于2.6.32及其后的内核. 我们在linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里.我们在使用这些数据的时候都是通过文件这个抽象来访问的, ...

  8. 评价指标ROC,PR

    之前实习的时候一直见公司里面的人说什么AUC, 实际AUC就是ROC曲线的面积 PR是precise和recall曲线,和ROC的区别是,当测试集中的正负样本分布变化的时候,ROC曲线能够保持不变,而 ...

  9. hdu2089 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. lucene-查询query->PrefixQuery使用前缀搜索

    PrefixQuery就是使用前缀来进行查找的.通常情况下,首先定义一个词条Term.该词条包含要查找的字段名以及关键字的前缀,然后通过该词条构造一个PrefixQuery对象,就可以进行前缀查找了. ...