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 ...
随机推荐
- openwrt 按下回车才能显示图标信息
如题所示,openwrt启动后,手动才能按下系统图标和信息. 如何却掉这个手动选项呢? 修改文件/SISP-L26.7.8-OpenWrt/build_dir/target-arm_uClibc-0. ...
- 2018年长沙理工大学第十三届程序设计竞赛 J杯子
链接:https://www.nowcoder.com/acm/contest/96/J来源:牛客网 杯子 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言655 ...
- HTTP-Runoob:HTPP Content-Type
ylbtech-HTTP-Runoob:HTPP Content-Type 1.返回顶部 1. HTTP content-type Content-Type,内容类型,一般是指网页中存在的Conten ...
- iOS利用SDWebImage图片下载缓存
一.我们先来了解一下SDWebImage的使用: 1.导入框架,引入头文件: #import "UIImageView+WebCache.h" 也可以直接使用CocoaPods来引 ...
- Compare and Swap(CAS)
CAS(Compare and Swap)是个原子操作.拿到一个新值后,CAS将其与内存中的值进行比较,若内存中的值和这个值不一样,则将这个值写入内存,否则,不做操作.在Java的 java.util ...
- JavaSwing文件选择器 JFileChooser的使用
先看效果吧! 说明:选择文件或者文件夹.本例子就直接在控制台输出文件或者文件夹的路径.实际开发中,就可以将文件或文件夹的路径封装为File的实例来使用了. package test; import j ...
- java飞机大战之子弹的自动生成
import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing. ...
- 关于taskaffinity属性的作用
意味着这activity更喜欢哪个TESK,具体见下方说明 当一个包含FLAG_ACTIVITY_NEW_TASK标志的intent启动一个activity时. 一个新的activity,默认地启动到 ...
- QT5环境搭建
https://blog.csdn.net/liang19890820/article/details/53931813
- Linux 使用静态库注意事项
1. 静态库一定要放在生成文件后面 gcc main.c -o main libhello.a 2. 使用静态库时一定要连接所有用到的静态库 gcc main.c -o main liba.a lib ...