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相关推荐

  1. bzoj 1132: [POI2008]Tro

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 1663  Solved: 558 [Submit][Statu ...

  2. BZOJ 1132 [POI2008]Tro(极角排序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...

  3. BZOJ.1132.[POI2008]Tro(极角排序)

    BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...

  4. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  5. android+手机mac地址,Android 获取手机Mac地址,手机名称

    /** * 获取手机mac地址 * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取mac地址: Stri ...

  6. 1132: [POI2008]Tro 计算几何

    首先O(N^3)是不科学的..我们起码要想办法优化到O(N^2logN). 考虑每次枚举一个点,以它作为一个顶点,然后维护一个前缀和来计算每个点与夹角在逆时针180°内的点(我表述的不好..边界可以二 ...

  7. 1132: [POI2008]Tro

    Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...

  8. bzoj1132 [POI2008]Tro(叉积)

    bzoj1132 [POI2008]Tro 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1132 题意: 平面上有N个点. 求出所有以这N ...

  9. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

最新文章

  1. python字符串进行位运算_不懂python如何使用函数进行分组运算?7种方法,函数分组不再难...
  2. PAT1017 和强迫症做斗争
  3. 关于IE6,奇数宽高的BUG
  4. HDU 6186 CS Course
  5. Django中实现MySQL主从同步实现读写分离
  6. python集合的两种类型_python 入门之 – 集合类型(十九)
  7. thymealf如何实现传单个变量给html_纯前端使用JavaScript发送电子邮件,5个步骤图文教程...
  8. jsp进入另一个jsp分块之后js代码失效_一个架构师的缓存修炼之路
  9. Android热修复实现及原理
  10. gravity与Layout_gravity的区别
  11. 微服务配置中心是干啥的_微服务化改造系列之三:配置中心
  12. 浏览器汇总介绍--Opera
  13. BIM族库下载——塔吊等垂直运输设备族库
  14. FPGA产生m序列及其应用
  15. 汽车域控制器架构和OTA的心脏:网关的四大豪门(上)
  16. order by 升序和降序排列显示
  17. 解读加多宝的营销案例分析
  18. android截视频播放器,Android视频播放器VPlayer升级:新增截图功能
  19. 美国出台最严技术出口管制!14项前沿科技面临封锁
  20. 微信内分享网页自定义标题,图片,描述

热门文章

  1. 实时 双向同步双向复制 即 Beedup 产品
  2. 博科光纤交换机价格售后维保
  3. Linux C : lseek函数
  4. boj-311-小马过河
  5. 如何查看Windows的版本信息
  6. 例解:过程性能模型的概念辨析
  7. 基金入门-指数基金、债券基金
  8. Supervisor — 进程管理
  9. 利用pdf.js在线展示PDF文档
  10. python爬取百度美女图片