bzoj 1132 几何

思路:我刚开始算三角形的方法是原点叉积三条边,然后计算每条边向量积的贡献,但是对于同一条线上的点

有时候没有办法抵消掉。。。。。

看网上的思路是对于一个三角形的面积通过两条边的叉积获得,然后枚举一个点,排序去掉公式的绝对值,记录

后缀和进行计算。。。

 

看的这篇博客。。

https://www.cnblogs.com/GXZlegend/p/7509699.html

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int, pair<int,int> >

using namespace std;

const int N = 3000 + 10;
const int M = 10 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-7;

int n;

LL sufx[N], sufy[N], ans;

struct Point {
    int x, y;
    Point(int x = 0, int y = 0) {
        this->x = x;
        this->y = y;
    }

    Point operator - (const Point &rhs) {
        return Point(x - rhs.x, y - rhs.y);
    }
} p[N], q[N];

bool cmp1(const Point &a, const Point &b) {
    return a.x == b.x ? a.y < b.y : a.x < b.x;
}

bool cmp2(const Point &a, const Point &b) {
    return a.y * b.x < b.y * a.x;
}


int main()
{
    scanf("%d", &n);

    for(int i = 1; i <= n; i++) {
        scanf("%lld%lld", &p[i].x , &p[i].y);
    }

    sort(p + 1, p + n + 1, cmp1);

    for(int i = 1; i <= n; i ++) {

        for(int j = i + 1; j <= n ;j++) {
            q[j] = p[j] - p[i];
        }

        sort(q + i + 1, q + n + 1, cmp2);

        for(int j = n; j > i; j--)
        {
            sufx[j] = sufx[j + 1] + q[j].x;
            sufy[j] = sufy[j + 1] + q[j].y;
            ans += q[j].x * sufy[j + 1] - q[j].y * sufx[j + 1];
        }
    }

    if(ans & 1) printf("%lld.5\n", ans / 2);
    else printf("%lld.0\n", ans / 2);
    return 0;
}

 

posted @ 2018-06-16 15:46  NotNight  阅读(139)  评论(0编辑  收藏  举报