時間限制: 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...