loj #2008. 「SCOI2015」小凸想跑步
#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_iXi、Yi Y_iYi 表示顶点的坐标。
输入保证按逆时针顺序输入点,所有点保证构成一个 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≤105,−109≤X,Y≤109
#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」小凸想跑步的更多相关文章
- 【LOJ】 #2008. 「SCOI2015」小凸想跑步
题解 一道想法很简单的计算几何(由于我半平面交总是写不对,我理所当然的怀疑半平面交错了,事实上是我直线建错了) 首先我们对于两个凸包上的点设为\((x_0,y_0)\)和\((x_1,y_1)\)(逆 ...
- 「SCOI2015」小凸想跑步 解题报告
「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 「SCOI2015」小凸解密码 解题报告
「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...
- 「SCOI2015」小凸玩矩阵 解题报告
「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...
- 「SCOI2015」小凸玩密室 解题报告
「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...
- AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006
「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...
随机推荐
- Linux驱动 - SPI驱动 之四 SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- java代码异常处理篇-----循环
总结:注意一个方法:nextLine();它表示:执行当前行,返回跳过的输入信息. package com.da; import java.util.InputMismatchException; i ...
- MacOS配置Erlang开发环境
Mac下安装Erlang brew 的安装: $ curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C ...
- 使用cython把python编译so
1.需求 为了保证线上代码安全和效率,使用python编写代码,pyc可直接反编译,于是把重要代码编译so文件 2.工作 2.1 安装相关库: pip install cython yum insta ...
- shell脚本 回顾 小练习
1.把/OPT目录下(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell” 2.将A.B.C目录下的文件A1.A2.A3文件改名为A4.A5.A63.如何在vi模式下将文件中的aa字符串 ...
- UML 学习[一]
上了好久软件工程,才开始这门课程中重要部分的学习----uml图. 统一建模语言(UML,英语:Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方 ...
- 如何将DevExpress的Gridcontrol导出到Excel
private void simpleButton1_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new S ...
- 第五章 JVM调优(待续)
Java虚拟机内存模型 JVM内存分配参数 垃圾收集基础 常用调优案列和方法 实用JVM参数 实战JVM调优
- vb和dos批处理创建或生成快捷方式
https://www.cnblogs.com/gszhl/archive/2009/04/23/1441753.html vb和dos批处理创建或生成快捷方式 首先说我现在用的一种,最有效的也是 ...
- 关于play!的attachments.path配置、以及关于Form表单上传请求的认识
相关链接 form表单提交multipart/form-data的请求分析:http://blog.csdn.net/five3/article/details/7181521.http://blog ...