【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/46605807");
}

题解:

首先暴力是 O(n3) 求每一个三角形面积。
但是三角形面积怎么求?一般我们都是用叉积……等等?那一个叉积不是被算了非常多遍?

好了。正解出来了,先有序地把点排排序保证不重。然后算一下每一个叉积的贡献。也就是每条边的贡献,,然后由于排序啥的。时间复杂度 O(n2logn)

然后这道题。呃,卡精度……?!
求叉积嘛,最后得到的东西都须要除以2。。先不除。到最后特判好了QwQ

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 3010
using namespace std;
struct Point
{
    long long x,y;
    void read(){scanf("%lld%lld",&x,&y);}
}now,p[N],tp[N];
inline long long xmul(Point B,Point C,Point A=now)
{return (C.y-A.y)*(B.x-A.x)-(B.y-A.y)*(C.x-A.x);}
bool cmpxy(Point A,Point B){return A.x==B.x?A.y<B.y:A.x<B.x;}
bool cmpmu(Point A,Point B){return xmul(A,B)>0;}

int n;
long long ans;
int main()
{
    freopen("test.in","r",stdin);

    int i,j,k;
    long long sumx,sumy;

    scanf("%d",&n);
    for(i=1;i<=n;i++)p[i].read();
        sort(p+1,p+n+1,cmpxy);
    for(i=1;i<=n-2;i++)
    {
        now=p[i];
        sumx=sumy=0;
        for(j=i+1;j<=n;j++)tp[j]=p[j];
            sort(tp+i+1,tp+n+1,cmpmu);
        for(j=i+1;j<=n;j++)
        {
            sumx+=tp[j].x-now.x;
            sumy+=tp[j].y-now.y;
        }
        for(j=i+1;j <n;j++)
        {
            sumx-=tp[j].x-now.x;
            sumy-=tp[j].y-now.y;
            ans+=(tp[j].x-now.x)*sumy;
            ans-=(tp[j].y-now.y)*sumx;
        }
    }
    if(ans&1)printf("%lld.5\n",ans>>1);
    else printf("%lld.0\n",ans>>1);

    return 0;
}
posted @ 2016-01-29 11:29  lcchuguo  阅读(229)  评论(0编辑  收藏  举报