BZOJ4445: [Scoi2015]小凸想跑步
裸半平面交。记得把P0P1表示的半平面加进去,否则点可能在多边形外。
#include<algorithm>
#include<cstdio>
#include<cmath>
using std::sort;
typedef double flo;
const int N=1e5+5;
struct vec{flo x,y;}p[N],q2[N];
flo det(vec a,vec b){return a.x*b.y-a.y*b.x;}
vec operator+(vec a,vec b){return(vec){a.x+b.x,a.y+b.y};}
vec operator-(vec a,vec b){return(vec){a.x-b.x,a.y-b.y};}
vec operator*(flo a,vec b){return(vec){a*b.x,a*b.y};}
struct line{
vec p,v;
flo a;
void cal(){a=atan2(v.y,v.x);}
}r[N],q1[N];
flo cal(vec a,line b){return det(a-b.p,b.v);}
bool operator<(line a,line b){return a.a<b.a||a.a==b.a&&cal(a.p,b)<0;}
vec over(line a,line b){
return a.p+det(a.p-b.p,b.v)/det(b.v,a.v)*a.v;
}
void ins(int i,int j){
flo a=p[0].y-p[i].y-p[1].y+p[j].y;
flo b=p[1].x-p[j].x-p[0].x+p[i].x;
flo c=det(p[0],p[1])-det(p[i],p[j]);
r[i].p.x=b?0:-c/a;
r[i].p.y=b?-c/b:0;
r[i].v=(vec){-b,a};
}
flo area(vec*p,int n){
flo s=det(p[n-1],p[0]);
for(int i=1;i<n;++i)
s+=det(p[i-1],p[i]);
return s;
}
int main(){
struct{
operator int(){
int x=0,y=0,c=getchar();
while(c<48)
y=c==45,c=getchar();
while(c>47)
x=x*10+c-48,c=getchar();
return y?-x:x;
}
}it;
int n=it;
for(int i=0;i<n;++i)
p[i].x=it,p[i].y=it;
r[0].p=p[0];
r[0].v=p[1]-p[0];
for(int i=1;i<n;++i)
ins(i,(i+1)%n);
for(int i=0;i<n;++i)
r[i].cal();
sort(r,r+n);
int a=0,b=-1;
for(int i=0;i<n;++i){
while(a<b&&cal(q2[b],r[i])>0)--b;
while(a<b&&cal(q2[a+1],r[i])>0)++a;
if(a>b||r[i].a!=q1[b].a)
q1[++b]=r[i],q2[b]=over(q1[b],q1[b-1]);
}
while(a<b&&cal(q2[b],q1[a])>0)--b;
q2[a]=over(q1[a],q1[b]);
flo s=area(q2+a,b-a+1)/area(p,n);
printf("%.4f\n",s);
}
BZOJ4445: [Scoi2015]小凸想跑步的更多相关文章
- 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]小凸想跑步(半平面交)
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
- [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)
题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...
- 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
[BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...
- 【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) ...
- [SCOI2015]小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- bzoj 4445 [SCOI2015] 小凸想跑步
题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率 根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值 #include<bits/stdc++ ...
- 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)
题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...
随机推荐
- Android四大组件之Activity详解——创建和启动Activity
前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 项目 ...
- 十天冲刺---Day9
站立式会议 站立式会议内容总结: 燃尽图 照片 队员们都回来了,写完之后继续对alpha版本进行迭代. 希望演示的时候能拿得出来.
- CSS巩固
1. 浮动元素与非浮动元素在一行,浮动元素不占宽度.所以应将非浮动元素改为浮动,或让非浮动元素的宽度为当前行的宽度. 元素浮动之后,周围的元素会重新排列. 2. 布局找模板,或参考其他网站! 自己进行 ...
- ActiveMQ_点对点队列(二)
一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式 二.配置信息 1 ...
- 数据库开发基础-SQl Server 基础
SQL Server 基础 1.什么是SQL Server SQL:Structured Query Language 结构化查询语言 SQL Server是一个以客户/服务器(c/s)模式访问.使 ...
- dede去掉当前位置position后面的箭头
理论是,dede的当前位置标签{dedefield name='position'},结构是 "首页 > 主栏目 > 子栏目 > ",箭头符号字段数据都是在后台设 ...
- C语言与套接字
我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...
- 关于property的一些知识
@property (nonatomic,assign,readonly) CGRect retweetViewFrame; retweetViewFrame设置为readonly,只有get方法,没 ...
- camerc文件播放
下载CamtasiaStudio 5中文版,打开CamtasiaStudio.exe在左边有生成选项,点左边工具框内添加/导入媒体,则选择下面的批量生成.弹出添加文件的菜单点添加文件,加入你要转换的c ...
- js-JavaScript高级程序设计学习笔记4
第六章 面向对象的程序设计 1.面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.如python.ES中没有类的概念. 2.ES的对象可以想象成散列表 ...