【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
题解
计算几何
考虑到所求的所有三角形的面积之和为$\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 计算几何的更多相关文章
- bzoj1132[POI2008]Tro 计算几何
1132: [POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1722 Solved: 575[Submit][Status] ...
- BZOJ1132: [POI2008]Tro
1132: [POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 815 Solved: 211[Submit][Status] ...
- 【计算几何】【极角序】【前缀和】bzoj1132 [POI2008]Tro
把点按纵坐标排序,依次枚举,把它作为原点,然后把之后的点极角排序,把叉积的公式稍微化简一下,处理个后缀和统计答案. #include<cstdio> #include<cmath&g ...
- bzoj 1132: [POI2008]Tro 计算几何
题目大意: 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 题解 我们看到了n的范围,于是我们就知道这一定不是一个线性算法 所以我们尝试枚举三角形的一个点,那么我们现 ...
- BZOJ1132: [POI2008]Tro(叉积 排序)
题意 世上最良心题目描述qwq 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Sol 直接模拟是$n^3$的. 考虑先枚举一个$i$,那么我们要算的就是$\sum_ ...
- 【BZOJ1132】[POI2008]Tro 几何
[BZOJ1132][POI2008]Tro Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000 ...
- BZOJ_1132_[POI2008]Tro_计算几何
BZOJ_1132_[POI2008]Tro_计算几何 Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3 ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
随机推荐
- jQuery无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
用jQuery写一个通过点击左右图标来翻阅图片的小插件,写好后测试可以正常运行,但是放到Tab中后发现只有第一个Tab中的代码能够正常运行,其它全部罢工了. 用Chrome自带的开发工具一查,发现罢工 ...
- Apache Flume - File通道设计
原文链接:https://blogs.apache.org/flume/entry/apache_flume_filechannel 说明:翻译在尽量符合原文表达的基础上,尽量保证行文流畅.水平有限, ...
- hdu 4408 Minimum Spanning Tree
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 51Nod 1062 序列中最大的数 | 简单DP
#include "iostream" #include "cstdio" using namespace std; #define LL long long ...
- 其他:OI竞赛中的文件操作
本文介绍三种方法进行文件输入输出,都非常实用 第一种方法是采用重定向的形式进行输入输出,很方便 freopen("input.txt","r",stdin); ...
- Java面试知识总结三
1.SpringMVC在项目中的应用? 1)service层,项目的业务逻辑层,一般先定义一个接口,在写一个实现类,实现所有的接口方法.service的实现类中要加注解@Service(用于标注业务层 ...
- 【bzoj3387-跨栏训练】线段树+dp
我们可以想到一个dp方程:f[i][0]表示当前在i个栅栏的左端点,f[i][1]表示在右端点. 分两种情况: 第一种:假设现在要更新线段gh的左端点g,而它下来的路径被ef挡住了,那么必定是有ef来 ...
- bzoj 1635: [Usaco2007 Jan]Tallest Cow 最高的牛——差分
Description FJ's N (1 <= N <= 10,000) cows conveniently indexed 1..N are standing in a line. E ...
- bzoj 1296 DP
对于每一行做DP预处理,w[i][j]代表这一行前i个刷j次的最大价值,那么w[i][j]=max(w[i][j],w[k][j-1]+sum[k+1][i]),sum[i][j]为i-j段刷一次最多 ...
- 基于Django Form源码开发自定义Form组件
import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...