#2008. 「SCOI2015」小凸想跑步

 

题目描述

小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏。

操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 \sim n - 10∼n−1 编号。现在小凸随机站在操场中的某个位置,标记为 P PP 点。将 P PP 点与 n nn 个顶点各连一条边,形成 N NN 个三角形。如果这时 P PP 点,0 00 号点,1 11 号点形成的三角形的面积是 N NN 个三角形中最小的一个,小凸则认为这是一次正确站位。

现在小凸想知道他一次站位正确的概率是多少。

输入格式

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

输出格式

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

样例

样例输入

5
1 8
0 7
0 0
8 0
8 8

样例输出

0.6316

数据范围与提示

3≤N≤105,−109≤X,Y≤109 3 \leq N \leq 10 ^ 5, -10 ^ 9 \leq X, Y \leq 10 ^ 93≤N≤10​5​​,−10​9​​≤X,Y≤10​9​​

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define eps 0.001
using namespace std;
struct node{
double x,y;
node(double a=,double b=):x(a),y(b){}
node operator + (const node &c)
{return node(x+c.x,y+c.y);}
node operator - (const node &c)
{return node(x-c.x,y-c.y);}
double operator * (const node &c)
{return x*c.y-y*c.x;}
node operator / (const double c)
{return node(x/c,y/c);}
}p[maxn];
int n;
double cnt1,cnt2,S;
double abs(double x){return x>?x:-x;}
void check(double x,double y){
node point=node(x,y);
double mn=;int k=-;double sum=;
for(int i=;i<n;i++){
node a=p[i],b=p[(i+)%n];
double s=(a-point)*(b-point)*0.5;
s=abs(s);
if(s<mn)mn=s,k=i;
sum+=s;
}
if(abs(sum-S)<=eps){
cnt1+=;
if(k==)cnt2+=;
}
}
int main(){
scanf("%d",&n);
double mxx=,mnx=,mxy=,mny=;
for(int i=;i<n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
mxx=max(mxx,p[i].x);
mxy=max(mxy,p[i].y);
mnx=min(mnx,p[i].x);
mny=min(mny,p[i].y);
}
for(int i=;i<n;i++)
S+=(p[i]-p[])*(p[i+]-p[]);
S*=0.5;
S=abs(S);
for(double i=mnx;i<=mxx;i+=0.001)
for(double j=mny;j<=mxy;j+=0.001)
check(i,j);
cnt2+=(n-)*;cnt1+=(n-)*;
cnt2/=cnt1;
printf("%.4lf",cnt2);
return ;
}

20分 乱搞

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 200010
using namespace std;
struct node{
long double x,y;
node(){}
node(long double a,long double b){x=a,y=b;}
node operator + (const node &a)
{return node(x+a.x,y+a.y);}
node operator - (const node &a)
{return node(x-a.x,y-a.y);}
node operator * (const long double &a)
{return node(x*a,y*a);}
long double operator * (const node &a)
{return x*a.y-y*a.x;}
}p[maxn];
struct line{
node p,v;
long double a;
line(){}
line(node x,node y){p=x,v=y,a=atan2(v.y,v.x);}
}l[maxn];
int n,tot,h,t,q[maxn];
long double ans,sum;
bool onleft(line a,node b){
return a.v*(b-a.p)>=;
}
node getp(line a,line b){
node u=a.p-b.p;
long double tmp=(b.v*u)/(a.v*b.v);
return a.p+a.v*tmp;
}
bool cmp(line a,line b){
if(fabs(a.a-b.a)==)return onleft(a,b.p);
return a.a<b.a;
}
inline void work(){
sort(l+,l+tot+,cmp);
int j=;
for(int i=;i<=tot;i++) if(fabs(l[i].a-l[j].a)>) l[++j]=l[i];
tot=j;
h=,t=,q[]=,q[]=;
for(int i=;i<=tot;i++){
while(h<t&&onleft(l[i],getp(l[q[t-]],l[q[t]])))t--;
while(h<t&&onleft(l[i],getp(l[q[h+]],l[q[h]])))h++;
q[++t]=i;
}
while(h<t&&onleft(l[q[h]],getp(l[q[t-]],l[q[t]])))t--;
for(int i=h;i<t;i++) p[i]=getp(l[q[i]],l[q[i+]]);
p[t]=getp(l[q[t]],l[q[h]]);
for(int i=h;i<t;i++)ans+=p[i]*(p[i+]-p[i]);
ans+=p[t]*(p[h]-p[t]);
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<n;i++)cin>>p[i].x>>p[i].y;
p[n]=p[];
for(int i=;i<n;i++){
l[++tot]=line(p[i+],p[i]-p[i+]);
sum+=p[i]*(p[i+]-p[i]);
}
for(int i=;i<n;i++){
long double a=p[i+].x-p[i].x-p[].x+p[].x;
long double b=p[i+].y-p[i].y-p[].y+p[].y;
long double c=-(p[i]*(p[i+]-p[i]))+(p[]*(p[]-p[]));
if(fabs(a)>)l[++tot]=line(node(,c/a),node(-a,-b));
else if(fabs(b)>)l[++tot]=line(node(-c/b,),node(,-b));
}
work();
printf("%.4lf",(double)fabs(ans/sum));
return ;
}

100分 半平面交

loj #2008. 「SCOI2015」小凸想跑步的更多相关文章

  1. 【LOJ】 #2008. 「SCOI2015」小凸想跑步

    题解 一道想法很简单的计算几何(由于我半平面交总是写不对,我理所当然的怀疑半平面交错了,事实上是我直线建错了) 首先我们对于两个凸包上的点设为\((x_0,y_0)\)和\((x_1,y_1)\)(逆 ...

  2. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  3. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  4. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  5. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  6. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  7. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  8. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  9. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

随机推荐

  1. Redis value的5种类型及常见操作

    Redis本身存储就是一个hash表,实际实࣫比hash表更复一些,后续讲存储结构时会细讲Key只有String类型Value包括String ,Set,List,Hash,Zset五中类型 STRI ...

  2. AFNetworking-2.5-源码阅读剖析--网络请求篇

    一.前言 AFNetworking,非常友好简单的网络请求第三方框架,在GitHub中已经获得了25000++的star,链接地址:https://github.com/AFNetworking/AF ...

  3. MXF文件结构浅析

    MXF是英文Material eXchange Format(素材交换格式)的缩语.MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式.MXF主要应用于影视行业媒体制作 ...

  4. http协议基础教程

    引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/ ...

  5. tortoisesvn 本项目的忽略项

    https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html Adding and Editing Pr ...

  6. js闭包(二)

    一.何谓“闭包”? 所谓“闭包(Closure)”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 描述的如此学术的官方解释,相信很少人能够 ...

  7. android中finish和system.exit方法退出的区别

    finish只是将此activity推向后台,并没有释放资源. 而system.exit则是杀死进程,会释放资源

  8. 使用ffmpeg压缩视频

    命令: ffmpeg -i 1.avi -b 64k 1-64k.avi ffmpeg下载:http://dl.pconline.com.cn/download/53703.html

  9. B和strong以及i和em的区别(转)

    B和strong以及i和em的区别 (2013-12-31 13:58:35) 标签: b strong i em 搜索引擎 分类: 网页制作 一直以来都以为B和strong以及i和em是相同的效果, ...

  10. ROS与Matlab系列:一个简单的运动控制

    ROS与Matlab系列:一个简单的运动控制 转自:http://blog.exbot.net/archives/2594 Matlab拥有强大的数据处理.可视化绘图能力以及众多成熟的算法函数,非常适 ...