【BZOJ4445】[Scoi2015]小凸想跑步

Description

小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏。
操场是个凸n边形,N个顶点按照逆时针从0~n-l编号。现在小凸随机站在操场中的某个位置,标记为P点。将P点与n个顶点各连一条边,形成N个三角形。如果这时P点,0号点,1号点形成的三角形的面积是N个三角形中最小的一个,小凸则认为这是一次正确站位。
现在小凸想知道他一次站位正确的概率是多少。

Input

第1行包含1个整数n,表示操场的顶点数和游戏的次数。
接下来有N行,每行包含2个整数Xi,Yi表示顶点的坐标。
输入保证按逆时针顺序输入点,所有点保证构成一个n多边形。所有点保证不存在三点共线。

Output

输出1个数,正确站位的概率,保留4位小数。

Sample Input

5
1 8
0 7
0 0
8 0
8 8

Sample Output

0.6316

HINT

3<=N<=10^5,-10^9<=X,Y<=10^9

题解:现在才发现,我有时喜欢用一条直线的左边来代表一个半平面,有时喜欢用一条直线的右面代表一个半平面。。不过无所谓啦~

题中的限制是三角形面积的大小关系,如果我们将三角形面积用叉积来表示的话很容易将所给条件变成n-1个不等式,外加n个不等式限定P在多边形内部。求半平面交即可。

至于精度。。。用long double,把eps删掉即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=200010;
typedef long double db;
struct point
{
db x,y;
point() {}
point(db a,db b) {x=a,y=b;}
point operator + (const point &a) const {return point(x+a.x,y+a.y);}
point operator - (const point &a) const {return point(x-a.x,y-a.y);}
point operator * (const db &a) const {return point(x*a,y*a);}
db operator * (const point &a) const {return x*a.y-y*a.x;}
}p[maxn];
struct line
{
point p,v;
db a;
line() {}
line(point x,point y) {p=x,v=y,a=atan2(v.y,v.x);}
}l[maxn];
int n,tot,h,t;
db ans,sum;
int q[maxn];
inline bool onlft(line a,point b)
{
return a.v*(b-a.p)>=0;
}
inline point getp(line a,line b)
{
point u=a.p-b.p;
db tmp=(b.v*u)/(a.v*b.v);
return a.p+a.v*tmp;
}
inline bool cmp(const line &a,const line &b)
{
if(fabs(a.a-b.a)==0) return onlft(a,b.p);
return a.a<b.a;
}
inline void HPI()
{
sort(l+1,l+tot+1,cmp);
int i,j=1;
for(i=2;i<=tot;i++) if(fabs(l[i].a-l[j].a)>0) l[++j]=l[i];
tot=j;
h=1,t=2,q[1]=1,q[2]=2;
for(i=3;i<=tot;i++)
{
while(h<t&&onlft(l[i],getp(l[q[t-1]],l[q[t]]))) t--;
while(h<t&&onlft(l[i],getp(l[q[h+1]],l[q[h]]))) h++;
q[++t]=i;
}
while(h<t&&onlft(l[q[h]],getp(l[q[t-1]],l[q[t]]))) t--;
for(i=h;i<t;i++) p[i]=getp(l[q[i]],l[q[i+1]]);
p[t]=getp(l[q[t]],l[q[h]]);
for(i=h;i<t;i++) ans+=p[i]*(p[i+1]-p[i]);
ans+=p[t]*(p[h]-p[t]);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i;
for(i=0;i<n;i++) p[i].x=rd(),p[i].y=rd();
p[n]=p[0];
for(i=0;i<n;i++) l[++tot]=line(p[i+1],p[i]-p[i+1]),sum+=p[i]*(p[i+1]-p[i]);
for(i=1;i<n;i++)
{
db a=p[i+1].x-p[i].x-p[1].x+p[0].x;
db b=p[i+1].y-p[i].y-p[1].y+p[0].y;
db c=-(p[i]*(p[i+1]-p[i]))+(p[0]*(p[1]-p[0]));
if(fabs(a)>0) l[++tot]=line(point(0,c/a),point(-a,-b));
else if(fabs(b)>0) l[++tot]=line(point(-c/b,0),point(0,-b));
}
HPI();
printf("%.4lf",(double)fabs(ans/sum));
return 0;
}

【BZOJ4445】[Scoi2015]小凸想跑步 半平面交的更多相关文章

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

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

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

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

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

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

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

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

  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. spring mvc 框架URL接收中文参数的乱码解决方案

    后台可能就会出现乱码,具体解决方案如下: 一. 配置tomcat目录下的service.xml文件 tomcat7/conf/server.xml 给该行代码加上 URIEncoding=" ...

  2. 标准代码页(codepage)列表

    https://blog.csdn.net/jianggujin/article/details/80325461 这篇文章有待完善 代码页 简称 全称 37 IBM037 IBM EBCDIC (U ...

  3. logback.xml常用配置详解

    <?xml version="1.0" encoding="UTF-8"?><configuration debug="false& ...

  4. Android 程序打包及签名(转)

    为什么要签名??? 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来 ...

  5. Hadoop教程(五)Hadoop分布式集群部署安装

    Hadoop教程(五)Hadoop分布式集群部署安装 1 Hadoop分布式集群部署安装 在hadoop2.0中通常由两个NameNode组成,一个处于active状态,还有一个处于standby状态 ...

  6. GDAL------加载Shapefile文件

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  7. 【Postgres】dump数据库备份与还原

    备份 pg_dump.exe -h localhost -p 5432 -U postgres -F plain -v -f C:\Backup.sql db1 2> C:\Backup.log ...

  8. Linux+Redis实战教程_day03_Redis-set【重点】_有序set(了解)

    2.redis-set[重点] Java HashSet  无序,不重复. Redis操作中,涉及到两个大数据集合的并集,交集,差集运算. 赋值: l sadd key values[value1.v ...

  9. Java 流(Stream)、文件(File)和IO -- Java ByteArrayOutputStream类

    Java ByteArrayOutputStream类 字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中.创建字节数组输出流对象有以下几种方式. 下面的构造 ...

  10. 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞分析

    0x01 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...