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 ...
随机推荐
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
目录(?)[-] 自定义的Parcelable类 AIDL文件 服务的实现 Client的实现 同步和异步 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处 ...
- 1 ignite核心特性
1 Ignite是什么? Apache Ignite是一个以内存为中心的分布式数据库.缓存和处理平台,支持事务.分析以及流式负载,可以在PB级数据上享有内存级的性能. 2 Ignite是不是内存数据库 ...
- spring学习六
1: @Valid 注解 @NotNull(message="名字不能为空") private String userName; @Max(value=120,message ...
- python (面向对象相关的三个模块)
hashlib,configparser,logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...
- SPARC T4 RAID Setup (ZT)
http://www.confignotes.com/2013/09/sparc-t4-raid-setup/ How to configure a RAID volume with the inte ...
- java 多线程系列基础篇(四)之 synchronized关键字
1. synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,s ...
- CALayer的基本使用
CALayer需要导入这个框架:#import <QuartzCore/QuartzCore.h> 一.CALayer常用属性 属性 说明 是否支持隐式动画 anchorPoint 和中心 ...
- js兼容事件
//浏览器检测(function () { window.sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.ma ...
- CentOS和Ubuntu系统下安装vsftp(助推大数据部署搭建)
不多说,直接上干货! 同时,声明,我这里安装的vsftp,仅仅只为我的大数据着想,关于网上的复杂安装,那是服务和运维那块.我不多牵扯,也不多赘述. 一.CentOS系统里安装vsftp 第一步:使用y ...
- Nginx 正向代理和反向代理
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...