题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率

根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值

 #include<bits/stdc++.h>
#define maxn 100010
#define eps 1e-10
using namespace std;
double ans,S1,S2;
struct P{
double x,y;
P(double a=,double b=){x=a,y=b;}
};
struct L{
P a,b;
double ang;
};
int sgn(double x){
return (x>eps)-(x<-eps);
}
P operator - (P a,P b){
return P(a.x-b.x,a.y-b.y);
}
double operator * (P a,P b){
return a.x*b.y-a.y*b.x;
}
bool operator < (L a,L b){
if(sgn(a.ang-b.ang)!=)return a.ang<b.ang;
return (a.a-b.a)*a.b<;
}
int n;
P s[maxn];
L l[maxn],q[maxn];P p[maxn];
int h,r,tot,cnt;
L get_line(P A,P B,P C,P D){
L l;
double a=-A.y-D.y+B.y+C.y;
double b=-B.x-C.x+A.x+D.x;
double c=-A.x*B.y-D.x*C.y+B.x*A.y+C.x*D.y;
l.b=P(b,-a);
if(sgn(a)!=)l.a=P(-c/a,);
else l.a=P(,-c/b);
return l;
}
void get_line(){
for(int i=;i<=n;++i)
l[++cnt]=get_line(s[],s[],s[i],s[i+]);
for(int i=;i<=n;++i){
l[++cnt].a=s[i];
l[cnt].b=s[i+]-s[i];
}
for(int i=;i<=cnt;++i)
l[i].ang=atan2(l[i].b.y,l[i].b.x);
}
P inter(L a,L b){
P p=b.a-a.a;
double t=(p*b.b)/(a.b*b.b);
P ans;
ans.x=a.a.x+a.b.x*t;
ans.y=a.a.y+a.b.y*t;
return ans;
}
bool jud(L a,L b,L c){
P p=inter(a,b);
return (p-c.a)*c.b>;
}
void get_Point(){
sort(l+,l+cnt+);tot=;
for(int i=;i<=cnt;++i)
if(sgn(l[i].ang-l[i-].ang)!=)
l[++tot]=l[i];
cnt=tot;tot=,h=;
q[++r]=l[];q[++r]=l[];
for(int i=;i<=cnt;++i){
if(sgn(q[r].b*q[r-].b)==)return;
if(sgn(q[h].b*q[h+].b)==)return;
while(h<r&&jud(q[r-],q[r],l[i]))r--;
while(h<r&&jud(q[h+],q[h],l[i]))h++;
q[++r]=l[i];
}
while(h<r&&jud(q[r-],q[r],q[h]))r--;
while(h<r&&jud(q[h+],q[h],q[r]))h++;
q[r+]=q[h];
for(int i=h;i<=r;++i)
p[++tot]=inter(q[i],q[i+]);
p[++tot]=p[];
}
double get_S(P a[],int cnt){
double ans=;
if(cnt<)return ;
for(int i=;i<cnt;++i){
ans+=a[i]*a[i+];
}
ans=fabs(ans/);
return ans;
}
void init(){
scanf("%d",&n);
for(int i=;i<=n;++i){
int x,y;scanf("%d%d",&x,&y);
s[i].x=x;s[i].y=y;
}
s[n+]=s[];
}
void work(){
get_line();
get_Point();
S1=get_S(s,n+);
S2=get_S(p,tot);
ans=S2/S1;
printf("%.4lf",ans);
}
int main(){
init();
work();
return ;
}

bzoj 4445 [SCOI2015] 小凸想跑步的更多相关文章

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

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

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

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

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

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

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

  5. [SCOI2015]小凸想跑步

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

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

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

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

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

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

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

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

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

随机推荐

  1. DOM对象

    DOM是以层次结构组织的节点或信息片断的集合.文档对象模型(Document Object Model)是给HTML与XML文件使用的一组API.DOM的本质是建立网页与脚本语言或程序语言沟通的桥梁. ...

  2. __new__方法

    __new__:创建对象时调用,返回当前对象的一个实例__init__:创建完对象后调用,对当前对象的实例的一些初始化,无返回值 案例一: >>> class A(object): ...

  3. 打造smali代码库辅助分析

    打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...

  4. 没听说过这些,就不要说你懂并发了,three。

    引言 很久没有跟大家再聊聊并发了,今天LZ闲来无事,跟大家再聊聊并发.由于时间过去的有点久,因此LZ就不按照常理出牌了,只是把自己的理解记录在此,如果各位猿友觉得有所收获,就点个推荐或者留言激励下LZ ...

  5. “连接配置中心失败,将无法进行正常管理”--腾讯通RTX管理器

    [故障现象]: 腾讯通RTX管理器提示“连接配置中心失败,将无法进行正常管理” [解决办法]: 在系统服务中启动“RTX_ConfigCenter”服务即可. 文章收集自网络

  6. 批处理命令——call 和 start

    一.call命令总结 [1]call命令简介 学过汇编或C的朋友,肯定都知道call指令表示什么意思.其实,在这里它的意思也是一样的.在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理 ...

  7. 阿里云部署Java web项目初体验(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  8. VIM退出命令

    注意:这些命令前面都有一个冒号: 当编辑完文档,准备退出Vi返回到shell时,能够使用以下几种方法之一. 在命令模式中,连按两次大写字母Z,若当前编辑的文档曾被修改过,则Vi保存该文档后退出,返回到 ...

  9. 了解Solr6.1结构及实现原理

    Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完 ...

  10. <s:property value=""/> 怎么截取返回值的固定长度的字符串

    ------背景-------------------- 列表中某一个字段的内容较长,显示不美观的情况下可以选择使用xxxxx....来显示,具体内容可见详情. ------解决方案--------- ...