BZOJ 1132 Tro
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
题解:
叉积之和
我们以每个点为原点,维护前缀和
为了保证夹角不超过π,先按水平序排序
为了保证面积都是正值,按极角序排序
1 #include<cmath> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 struct point 9 { 10 long long x, y; 11 friend inline long long operator * (point a, point b) 12 { 13 return a.x * b.y - a.y * b.x; 14 } 15 friend inline point operator - (point a, point b) 16 { 17 return (point) {a.x - b.x, a.y - b.y}; 18 } 19 inline void empty() 20 { 21 x = y = 0; 22 } 23 }; 24 point operator + (point a, point b) 25 { 26 point c; 27 c.x = a.x + b.x; 28 c.y = b.y + b.y; 29 return c; 30 } 31 const int maxn = 3333; 32 int n; 33 point p[maxn]; 34 inline bool lev(point a, point b) 35 { 36 if(a.y != b.y) return a.y < b.y; 37 return a.x < b.x; 38 } 39 40 int num; 41 point np[maxn]; 42 inline bool ang(point a, point b) 43 { 44 return a * b > 0; 45 } 46 point sum; 47 long long ans; 48 int main() 49 { 50 scanf("%d", &n); 51 for(int i = 1; i <= n; ++i) scanf("%lld %lld", &p[i].x, &p[i].y); 52 sort(p + 1, p + 1 + n, lev); 53 for(int k = 1; k <= n; ++k) 54 { 55 num = 0; 56 for(int i = k + 1; i <= n; ++i) np[++num] = p[i] - p[k]; 57 sort(np + 1, np + 1 + num, ang); 58 sum.empty(); 59 for(int i = 1; i <= num; ++i) 60 { 61 ans += sum * np[i]; 62 sum.x += np[i].x; 63 sum.y += np[i].y; 64 } 65 } 66 printf("%lld.%d", ans >> 1, (ans & 1) ? 5 : 0); 67 }
转载于:https://www.cnblogs.com/lytccc/p/6899662.html
BZOJ 1132 Tro相关推荐
- bzoj 1132: [POI2008]Tro
1132: [POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1663 Solved: 558 [Submit][Statu ...
- BZOJ 1132 [POI2008]Tro(极角排序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...
- BZOJ.1132.[POI2008]Tro(极角排序)
BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- android+手机mac地址,Android 获取手机Mac地址,手机名称
/** * 获取手机mac地址 * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取mac地址: Stri ...
- 1132: [POI2008]Tro 计算几何
首先O(N^3)是不科学的..我们起码要想办法优化到O(N^2logN). 考虑每次枚举一个点,以它作为一个顶点,然后维护一个前缀和来计算每个点与夹角在逆时针180°内的点(我表述的不好..边界可以二 ...
- 1132: [POI2008]Tro
Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...
- bzoj1132 [POI2008]Tro(叉积)
bzoj1132 [POI2008]Tro 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1132 题意: 平面上有N个点. 求出所有以这N ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
最新文章
- python字符串进行位运算_不懂python如何使用函数进行分组运算?7种方法,函数分组不再难...
- PAT1017 和强迫症做斗争
- 关于IE6,奇数宽高的BUG
- HDU 6186 CS Course
- Django中实现MySQL主从同步实现读写分离
- python集合的两种类型_python 入门之 – 集合类型(十九)
- thymealf如何实现传单个变量给html_纯前端使用JavaScript发送电子邮件,5个步骤图文教程...
- jsp进入另一个jsp分块之后js代码失效_一个架构师的缓存修炼之路
- Android热修复实现及原理
- gravity与Layout_gravity的区别
- 微服务配置中心是干啥的_微服务化改造系列之三:配置中心
- 浏览器汇总介绍--Opera
- BIM族库下载——塔吊等垂直运输设备族库
- FPGA产生m序列及其应用
- 汽车域控制器架构和OTA的心脏:网关的四大豪门(上)
- order by 升序和降序排列显示
- 解读加多宝的营销案例分析
- android截视频播放器,Android视频播放器VPlayer升级:新增截图功能
- 美国出台最严技术出口管制!14项前沿科技面临封锁
- 微信内分享网页自定义标题,图片,描述