【POI2008】【BZOJ1132】Tro

Description

平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000

Input

第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]

Output

保留一位小数,误差不超过0.1

Sample Input

5

0 0

1 2

0 2

1 0

1 1
Sample Output

7.0
HINT

Source

这题还是有点厉害的…
一开始感觉是建凸包然后化一化公式但是还是不会做
后来看了Po姐姐题解发现里面有个前缀和Σ( ° △ °|||)︴
PoPoQQQ的题解

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 3010
#define GET (ch>='0'&&ch<='9')
#define LL long long
using namespace std;
int n,cnt;
LL ans;
void in(int &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
struct Point
{
    int x,y;
    double k;
    bool operator <(const Point& a)const    {   return x==a.x?y<a.y:x<a.x;  }
    friend Point operator -(Point& a,Point& b)  {   return (Point){a.x-b.x,a.y-b.y};    }
}s[MAXN],sta[MAXN];
bool cmp(Point a,Point b)   {   return a.k<b.k; }
int main()
{
    in(n);
    for (int i=1;i<=n;i++)  in(s[i].x),in(s[i].y);
    sort(s+1,s+n+1);
    for (int i=1;i<=n;i++)
    {
        cnt=0;
        LL sumx=0,sumy=0;
        for (int j=i+1;j<=n;j++)    sta[++cnt]=s[j]-s[i],sta[cnt].k=sta[cnt].x?(double)sta[cnt].y/sta[cnt].x:1e20;
        sort(sta+1,sta+cnt+1,cmp);
        for (int j=1;j<=cnt;j++)    ans+=sumx*sta[j].y-sumy*sta[j].x,sumx+=sta[j].x,sumy+=sta[j].y;
    }
    printf("%lld.%d\n",ans>>1,ans&1?5:0);
}

你可能感兴趣的:(计算几何,面积,前缀和)