凸多邊形面積應用
阿新 • • 發佈:2019-01-06
連結:https://ac.nowcoder.com/acm/contest/328/F
來源:牛客網
題目描述
Rabbit和xxx獲得了一個很大的蛋糕,這個蛋糕實際上是由N個點組成的凸多邊形(點從1到N編號,保證沒有三點共線)。
接著兩個人開始分蛋糕,他們準備沿著蛋糕上兩點連成的直線把蛋糕切成兩份,由於Rabbit是女生,xxx總會把大的那一份分給Rabbit。現在有Q種切的方案,xxx可以選擇任意一種,問xxx最多能分得多少蛋糕?
輸入描述:
第一行兩個整數N,Q。
接下來N行,每行兩個數xi,yi表示第i個點的座標(點按逆時針順序給出)。
接下來Q行,每行兩個整數S,T表示切的兩個點。
輸出描述:
輸出xxx最多能分得多少面積的蛋糕。
示例1
輸入
4 2 0.5 0.5 10.5 0.5 10.5 10.5 0.5 10.5 1 3 4 2
輸出
50.00
備註:
3<=n<=105
1<=q<=105
−105<=xi,yi<=105
1<=S,T<=N,S!=T
本題採用special judge,假設你的答案為a,標程答案為b,如果滿足|a−b|max(1,|b|)≤10−4|a−b|max(1,|b|)≤10−4,則認為是正確的
多邊形面積顯然很好求,就是鄰邊叉積之和/2。
程式碼;
#include<bits/stdc++.h> #define db double using namespace std; const int maxn=1e5+10; db x[maxn],y[maxn],sum1[maxn],sum2[maxn],ans; int main() { int n,q,s,t; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); y[n+1]=y[1],x[n+1]=x[1]; for(int i=1;i<=n;i++) { sum1[i]=sum1[i-1]+x[i]*y[i+1]; sum2[i]=sum2[i-1]+y[i]*x[i+1]; } db S=(sum1[n]-sum2[n])/2; while(q--) { scanf("%d%d",&s,&t); if(s>t)swap(s,t); db t1=sum1[t-1]-sum1[s-1]+x[t]*y[s]; db t2=sum2[t-1]-sum2[s-1]+y[t]*x[s]; db tmp=(t1-t2)/2; ans=max(ans,min(tmp,S-tmp)); } printf("%.2lf\n",ans); }