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]小凸想跑步(半平面交)
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
随机推荐
- Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
一.gets() 函数详解 gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符('\n')不属于这个字符串. 调用格式为: gets(str); 其中str为字符串变量(字 ...
- Go - 路径、目录名、包名、文件名
先看一个示例: 1.目录结构 bin pkg src pk1 pk2 function1.go function2.go index.go 2.function1.go 文件内容: package p ...
- memcache与memcached的区别
其实到底说成什么无所谓,只要你真正理解和知道使用就可以了!但是介于有和我一样学习时遇到的这个疑惑,在此分享下其中的缘由: Memcache是一个软件 Memcache是一个自由和开放源代码.高性能.分 ...
- MFC 鼠标 移动到某控件时 修改鼠标形状为手的形状
响应窗体的 OnSetCursor 消息响应 鼠标移动到某空间时改变 形状 BOOL CQQBulkDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT m ...
- JBOSS 5 session时间配置
C:\jboss-5.1.0.GA\server\default\deployers\jbossweb.deployer web.xml <session-config> < ...
- php万年历
最近学习php循环.日期显示.GET方式请求,进而实现了一个小程序. 直接上代码: <?php header("Content-type:text/html; charset=UTF- ...
- 安装切换openjdk
安装各种版本openjdk sudo apt-get install openjdk-6-jdk sudo apt-get install openjdk-7-jdk sudo apt-get ins ...
- mysql连结查询
2016年4月13日 18:08:22 星期三 union 会生成临时表, 然后一同取出合并 join 或子查询, 会生成临时表进行嵌套循环 临时表, 缺点就是没有索引
- 使用EmBitz开发STM32项目的环境配置
一.EmBitz软件获取与安装 1.EmBitz软件的获取 EmBitz原名Em::Blocks,是基于Code::Blocks开发的,面向嵌入式的C/C++集成开发环境.支持J-Link和ST-Li ...
- C#设计模式之工厂方法
工厂方法模式: 1.不再提供一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成 如果出现新的按钮类型,只需要为这种新类型的按钮定义一个具体的工厂类就可以创建该新按 ...