zoukankan      html  css  js  c++  java
  • 【bzoj1132】[POI2008]Tro 计算几何

    题目描述

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

    输入

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

    输出

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

    样例输入

    5
    0 0
    1 2
    0 2
    1 0
    1 1

    样例输出

    7.0


    题解

    计算几何

    考虑到所求的所有三角形的面积之和为$sumlimits_{i<j<k}|(y_j-y_i)*(x_k-x_i)-(y_k-y_i)*(x_j-x_i)|$,这样直接计算的时间复杂度是$O(n^3)$的。

    如果我们先枚举$i$,并计算出以$P_i$为原点的其它点的相对坐标,那么要求的就是$sumlimits_{i<j<k}|y_j*x_k-y_k*x_j|$,注意这里有绝对值符号,为了去掉绝对值,需要满足在枚举$i$时,对于任意的$i<j<k$均有$i o j$在$i o k$的逆时针方向。所以我们把所有点按照$x$排序,那么$j$和$k$就都在$i$右侧,只需要再将$i$右侧的点按照与$i$连线的斜率排序即可。

    去掉绝对值后即求$sumlimits_{j=i+1}^n(y_j*sumlimits_{k=j+1}^nx_k-sumlimits_{k=j+1}^ny_k*x_j)$,维护两个坐标的后缀和,扫一遍即可出解。

    时间复杂度$O(n^2log n)$,瓶颈在于排序。

    本题卡精(卡atan2),因此必须按照横坐标、斜率排序以避免精度问题。另外需要开long long。

    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    #define N 3010
    using namespace std;
    typedef long long ll;
    struct data
    {
        ll x , y;
        data(ll a = 0 , ll b = 0) {x = a , y = b;}
        data operator-(const data &a)const {return data(x - a.x , y - a.y);}
        bool operator<(const data &a)const {return y * a.x < x * a.y;}
    }a[N] , t[N];
    ll sx[N] , sy[N];
    bool cmp(data a , data b)
    {
        return a.x == b.x ? a.y < b.y : a.x < b.x;
    } 
    int main()
    {
        int n , i , j;
        ll ans = 0;
        scanf("%d" , &n);
        for(i = 1 ; i <= n ; i ++ ) scanf("%lld%lld" , &a[i].x , &a[i].y);
        sort(a + 1 , a + n + 1 , cmp);
        for(i = 1 ; i <= n ; i ++ )
        {
            for(j = i + 1 ; j <= n ; j ++ ) t[j] = a[j] - a[i];
            sort(t + i + 1 , t + n + 1);
            for(j = n ; j > i ; j -- )
            {
                sx[j] = sx[j + 1] + t[j].x , sy[j] = sy[j + 1] + t[j].y;
                ans += t[j].x * sy[j + 1] - t[j].y * sx[j + 1];
            }
        }
        printf("%lld.%lld
    " , ans / 2 , ans % 2 * 5);
        return 0;
    }
    

     

  • 相关阅读:
    hive之insert导入分区数据
    Hive数据倾斜及优化方案
    Hive中join关键字运行机制及使用详解
    如何去编写一个定时器?
    MapReduce运行原理详解
    nfs共享服务搭建
    IDEA中Java方法的抽取
    阿里巴巴开发规约(Alibaba Java Coding Guidelines)安装介绍
    IDEA集成vue
    写给初学asp.net的新人们 新手学习经验
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7509699.html
Copyright © 2011-2022 走看看