1. 程式人生 > >凸多邊形面積應用

凸多邊形面積應用

連結: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);
}