题目描述

平面上有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


题解

计算几何

考虑到所求的所有三角形的面积之和为$\sum\limits_{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$为原点的其它点的相对坐标,那么要求的就是$\sum\limits_{i<j<k}|y_j*x_k-y_k*x_j|$,注意这里有绝对值符号,为了去掉绝对值,需要满足在枚举$i$时,对于任意的$i<j<k$均有$i\to j$在$i\to k$的逆时针方向。所以我们把所有点按照$x$排序,那么$j$和$k$就都在$i$右侧,只需要再将$i$右侧的点按照与$i$连线的斜率排序即可。

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

时间复杂度$O(n^2\log 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\n" , ans / 2 , ans % 2 * 5);
return 0;
}

【bzoj1132】[POI2008]Tro 计算几何的更多相关文章

  1. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...

  2. BZOJ1132: [POI2008]Tro

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 815  Solved: 211[Submit][Status] ...

  3. 【计算几何】【极角序】【前缀和】bzoj1132 [POI2008]Tro

    把点按纵坐标排序,依次枚举,把它作为原点,然后把之后的点极角排序,把叉积的公式稍微化简一下,处理个后缀和统计答案. #include<cstdio> #include<cmath&g ...

  4. bzoj 1132: [POI2008]Tro 计算几何

    题目大意: 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 题解 我们看到了n的范围,于是我们就知道这一定不是一个线性算法 所以我们尝试枚举三角形的一个点,那么我们现 ...

  5. BZOJ1132: [POI2008]Tro(叉积 排序)

    题意 世上最良心题目描述qwq 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Sol 直接模拟是$n^3$的. 考虑先枚举一个$i$,那么我们要算的就是$\sum_ ...

  6. 【BZOJ1132】[POI2008]Tro 几何

    [BZOJ1132][POI2008]Tro Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000 ...

  7. BZOJ_1132_[POI2008]Tro_计算几何

    BZOJ_1132_[POI2008]Tro_计算几何 Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3 ...

  8. bzoj 1132 [POI2008]Tro 几何

    [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1796  Solved: 604[Submit][Status][Discu ...

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

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

随机推荐

  1. mysql绿色版安装,多实例安装

    1.为什么要装多个mysql多实例? 关于这个的原因,我目前了解为建立一个主数据库,一个或者多个从库,实现一主多从或者主从复制的目的. 2.设么是mysql的多实例? MySQL多实例就是在一台机器上 ...

  2. uboot的硬件驱动

    1.uboot借用(移植)了linux驱动(1)linux驱动本身做了模块化设计.linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot借用(移植)的关键.(2)uboot ...

  3. 解决oracle数据库 ora-00054:resource busy and acquire with NOWAIT specified 错误

    解决oracle数据库 ora-00054:resource busy and acquire with NOWAIT specified 错误 本人在使用pl/sql developer 客户端调用 ...

  4. MyBatis框架的使用及源码分析(六) MapperRegistry

    我们先Mapper接口的调用方式,见<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用>的示例: public void findUserById() { Sql ...

  5. shell 25个常用命令

    1.列出所有目录使用量,并按大小排序.   ls|xargs du -h|sort -rn #不递归下级目录使用du -sh 2.查看文件排除以#开关和空白行,适合查看配置文件.   egrep -v ...

  6. Bzoj4870 [SXOI2017]组合数问题

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 155  Solved: 78 Description Input 第一行有四个整数 n, p, k, ...

  7. Super A^B mod C (快速幂+欧拉函数+欧拉定理)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...

  8. Codeforces Round #484 (Div. 2)

    题目链接:http://codeforces.com/contest/982 A. Row time limit per test:1 second memory limit per test:256 ...

  9. HDU 1231 最大连续子序列 (dp)

    题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,  Nj },其中 1 <= ...

  10. vue调试工具

    在进行vue项目开发的时候,免不了要进行调试,谷歌插件vue-devtools可以帮忙 步骤 步骤一: 到谷歌商店搜索"vue-devtools"下载 步骤二: 在chrome的扩 ...