小凸想跑步

2021-07-09 05:36:04 字數 1978 閱讀 6055

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

小凸晚上喜歡到操場跑步,今天他跑完兩圈之後,他玩起了這樣乙個遊戲。

操場是個凸n邊形,n個頂點按照逆時針從0 ~ n-1編號。現在小凸隨機站在操場的某個位置,標記為p點。將p點與n個頂點各連一條邊,形成n個三角形。如果這時p點,0號點,1號點形成的三角形的面積是n個三角形中最小的乙個,小凸則認為這是一次正確站位。

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

輸入

第1行包含1個整數n,表示操場的頂點數和遊戲的次數。

接下來有n行,每行包含2個整數xi,yi,表示頂點的座標。

輸入保證按逆時針順序輸入點,所有點保證構成乙個凸多邊形。所有點保證不存在三點共線。

輸出

輸出1個數,正確站位的概率,保留4個小數。

樣例輸入

5 1 8

0 7

0 0

8 0

8 8樣例輸出

0.6316

資料範圍

對於30%的資料,3≤n≤4,0≤x,y≤10

對於100%的資料,3≤n≤105,-109≤x,y≤109

**

scoi 2015 day1

對於每一條邊,我們可以解乙個不等式得到以它為底的三角形面積大於以01號點連邊為底的三角形的範圍,由此可以得到n個半平面,然後求半平面角即可。

#include

#include

#include

#include

#include

#include

#include

#define n 100010

#define eps 1e-7

using namespace std;

int n,tot;

double ans1,ans2;

struct point;}

point operator-(const point &p)

const;}

point operator*(const double &num)

const;}

double operator^(const point &p)

const

}t[n],p[n*2];

struct node

double get_ang(point p)

point get_jd(node a,node b)

void solve()

while(lq[l],get_jd(q[r],q[r-1])))r--;

while(lq[r],get_jd(q[l],q[l+1])))l++;

if(r-l<=1)return;

q[r+1]=q[l];tot=0;

for(int i=l;i<=r;i++)p[++tot]=get_jd(q[i],q[i+1]);

p[tot+1]=p[1];

for(int i=1;i<=tot;i++)ans2+=fabs((p[i]-p[1])^(p[i+1]-p[1]));

}void prepare()

else

if(fabs(b)0,p3=c/a,p4=1;if(a<0)swap(p1,p3),swap(p2,p4);}

else

if(b<0)p1=0,p2=c/b,p3=1,p4=c/b-a/b;

else p1=1,p2=c/b-a/b,p3=0,p4=c/b;

point x1=(point),x2=(point);

s[i]=(node);

} s[1]=(node);

} int main()

SCOI2015 小凸想跑步

題目 先推一波式子,設 p x,y 那麼我們嘗試寫出點 x i,y i x y 和 p x,y 形成的三角形面積,就是用叉積寫一波 2s x i x y y x x y i y 大力拆開式子,發現 2s y y x x x i y x iy x y i 不難發現這是乙個 ax by c 的形式,肯定...

SCOI2015 小凸想跑步

半平面交 題目要求求出讓 delta pp 0p 1 在所有形成的三角形中面積最小 那麼可以考慮對於點 p x y p p 一定有 x x 1 y y 1 times x 0 x 1 y 0 y 1 x x i y y i times x x i y y i 那麼把式子化開就可以得到若干 ax by...

SCOI2015 小凸想跑步 解題報告

最開始以為和多邊形的重心有關,後來發現多邊形的重心沒啥好玩的性質 實際上你把面積小於的不等式列出來,發現是一次的,那麼就可以半平面交了 code include include include define vector point const int n 2e5 10 const double e...