bzoj 4445 [SCOI2015] 小凸想跑步
题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率
根据题意列方程,最后求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] 小凸想跑步的更多相关文章
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- 4445: [Scoi2015]小凸想跑步 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...
- 【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) ...
- 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
[BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...
- [SCOI2015]小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...
- 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)
题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...
- BZOJ4445: [Scoi2015]小凸想跑步
裸半平面交. 记得把P0P1表示的半平面加进去,否则点可能在多边形外. #include<bits/stdc++.h> #define N 100009 using namespace s ...
- BZOJ4445 SCOI2015小凸想跑步(半平面交)
考虑怎样的点满足条件.设其为(xp,yp),则要满足(x0-xp,y0-yp)×(x1-xp,y1-yp)<=(xi-xp,yi-yp)×(xi+1-xp,yi+1-yp)对任意i成立.拆开式子 ...
- 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
随机推荐
- sql中case when语句的使用-来自网摘文章
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- codeblock 编译googletest
1.cmake安装 2.codeblock 16.01 3.Google Test 1.7.0 4.PATH路径添加(重启电脑,保证设置的PATH路径生效) 5.python安装 6.编译安装: ...
- Git 常用命令合集
$ git init 建立git仓库(一般都是在github上新建好,直接克隆到本地) $ git clone **.git 克隆git仓库 $ git add -A ...
- 百度地图用ip获取当前位置的经纬度(高精度)
步骤比较简单先上百度地图API官网,申请一个应用AK(访问凭据):查看一下高进度定位的API,看看是否都符合要求下面直接上代码 /** * 根据ip获取地理坐标 * @param ip * @retu ...
- centOS 虚拟机设置固定IP:图形化设置
右键单击图形化标志,Edit Connection 设置一下就可以了.
- Outlook~设置
outlook2013 中帐户设置无法直接更改邮件投递位置到本地的.pst文件,“更改文件夹”选项已经删除. Exchange 传递到 Outlook 数据文件 (.pst) 升级到 Outlook ...
- HTML5本地缓存数据
//HTML5本地缓存数据 function putObj(key, data) { if (!!window.localStorage) { var obj = { "key": ...
- JDK各个版本的新特性jdk1.5-jdk8
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...
- Requests库练习
预备知识 字符串方法 用途 string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 ...
- html学习第二天—— 第八章—— CSS选择器
标签选择器其实就是html代码中的标签.如右侧代码编辑器中的<html>.<body>.<h1>.<p>.<img>.例如下面代码:p{fo ...