【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
【BZOJ4445】[Scoi2015]小凸想跑步
Description
Input
Output
Sample Input
1 8
0 7
0 0
8 0
8 8
Sample Output
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]小凸想跑步 半平面交的更多相关文章
- 4445: [Scoi2015]小凸想跑步 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...
- bzoj 4445 小凸想跑步 - 半平面交
题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...
- BZOJ4445: [Scoi2015]小凸想跑步
裸半平面交. 记得把P0P1表示的半平面加进去,否则点可能在多边形外. #include<bits/stdc++.h> #define N 100009 using namespace s ...
- [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)
题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...
- 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]小凸想跑步(半平面交)
[BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- [SCOI2015]小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...
随机推荐
- Android 内存
memory usage of this progress under 15MB for 1GB RAM device Android内存机制分析下篇:分析APP内存使用情况http://mobile ...
- 使用springmvc,jsp,结合网页文本编辑器kindEditor实现基本博客编辑功能
kindEditor官网:http://kindeditor.net/demo.php 个人实践: 为了在自己的项目中引入一个类似用户写博客的功能,在网上找到了kindeditor,真心又好又易用. ...
- nagios安装check_linux_stats.pl插件报错Can't locate Sys/Statistics/Linux.pm in @INC的处理?
问题描述: 今天想有没有监控主机内存的插件可以供nagios来使用,然后找到一个插件check_linux_stats.pl 但是在将脚本上传之后,执行的时候报错 [root@testvm02 lib ...
- linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?
需求描述: 今天在配置nrpe.cfg这个文件,里面有allowed_hosts的IP地址,需要加上监控主机的地址,所以首先要搜索 到这个地址,然后呢,加上监控主机的地址,考虑通过sed命令来实现 操 ...
- 定时器Enable Disable控制
问题:定时器如何控制它一会可用一会不可用,根据某个业务需求,比如:一个控制台程序扫描表中某个条件的数据,处理数据,控制台分布式部署,当主机宕机后,从机扫描定时器需要可用,当主机复活后,从机的扫描定时器 ...
- Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作
- MySQL--指定浮点型数据的精确度TRUNCATE
INSERT INTO perf_week(node_id,perf_time,pm25,pm10,temp,humi) ) ) ) ) AS humi FROM perf_pm25 WEEK) AN ...
- 随笔 -- IO -- Socket/ServerSocket -- Echo(BIO)实例
随笔 -- IO -- Socket/ServerSocket -- 系统概述 Java中提供的专门的网络开发程序包------java.net Java的网络编程提供的两种通信协议:TCP和UDP ...
- 为什么GPL是更好的开源许可证?
1. 让我从一件新闻讲起. 2009年,计算机业界发生了一件大事:甲骨文公司以74亿美元收购SUN公司. 消息宣布后,有一个人坚决反对这笔交易.他叫Michael Widenius,是数据库软件MyS ...
- zabbix添加对tomcat线程池的监控
在zabbix模板中添加以下监控项: 可以参考文档:http://www.fblinux.com/?p=616