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

根据题意列方程,最后求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. 解决Can't connect to MySQL server on 'localhost' (10048)

    解决Can't connect to MySQL server on 'localhost' (10048) 您使用的是Windows操作系统,此错误与一个注册表键值TcpTimedWaitDelay ...

  2. 【Network】UDP 大包怎么发? MTU怎么设置?

    这里主要用UDP来发送视频,当发送的数据大于1500时分包发送,保证每包小于1500.发送好办,分割后循环发就可以了,关键是接收时的处理.先做一下处理的方法 :发送时每包上面加上标识,比如RTP的做法 ...

  3. WebService -- Java 实现之 CXF (初体验)

    1. 认识WebService 简而言之,她就是:一种跨编程语言以及操作系统的远程调用技术. 大家都可以根据定义好的规范和接口进行开发,尽管各自的使用的开发语言和操作系统有所不同,但是由于都遵循统一的 ...

  4. 在虚拟机下安装hadoop集成环境(centos7+hadoop-2.6.4+jdk-7u79)

    [1]64为win7系统,用virtualbox建立linux虚拟机时,为什么没有64位的选项? 百度 [2]在virtualbox上安装centos7 [3]VirtualBox虚拟机网络环境解析和 ...

  5. java1

    1:计算机概述(了解) (1)计算机 (2)计算机硬件 (3)计算机软件 系统软件:window,linux,mac 应用软件:qq,yy,飞秋 (4)软件开发(理解) 软件:是由数据和指令组成的.( ...

  6. js 中 Math对象

    Math 对象是一个固有的对象,无需创建它,直接把 Math 作为对象使用就可以调用其所有属性和方法.这是它与Date,String对象的区别. Math 对象属性 Math 对象方法

  7. 时间戳与日期时间互转C语言

    /*  * ctime.h  *  *  Created on: May 19, 2016  *      Author: root  */   #ifndef CTIME_H_ #define CT ...

  8. Git配置姓名和邮箱问题

    今天在安装Git for windows完成后,配置姓名和邮箱.按照廖雪峰老师的步骤,在开始菜单里找到"Git"->"Git Bash",单击后并没有跳出 ...

  9. CoreAnimation 之CATextLayer

    如果你想在一个图层中显示文字,完全可以借助图层代理直接将Core Graphics写入图层的内容(这就是UILabel的精髓).如果雨果寄宿于图层的视图,直接在图层上操作,其实相当繁琐.你要为每一个显 ...

  10. 仿qq联系人 学习笔记---ExpandableListActivity的使用

    [转]原地址  http://blog.163.com/xygzx@126/blog/static/237809502011102010100331/ 效果显示图: 1.布局文件 main.xml(E ...