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
题解:
叉积之和
我们以每个点为原点,维护前缀和
为了保证夹角不超过π,先按水平序排序
为了保证面积都是正值,按极角序排序
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
long long x, y;
friend inline long long operator * (point a, point b)
{
return a.x * b.y - a.y * b.x;
}
friend inline point operator - (point a, point b)
{
return (point) {a.x - b.x, a.y - b.y};
}
inline void empty()
{
x = y = ;
}
};
point operator + (point a, point b)
{
point c;
c.x = a.x + b.x;
c.y = b.y + b.y;
return c;
}
const int maxn = ;
int n;
point p[maxn];
inline bool lev(point a, point b)
{
if(a.y != b.y) return a.y < b.y;
return a.x < b.x;
} int num;
point np[maxn];
inline bool ang(point a, point b)
{
return a * b > ;
}
point sum;
long long ans;
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%lld %lld", &p[i].x, &p[i].y);
sort(p + , p + + n, lev);
for(int k = ; k <= n; ++k)
{
num = ;
for(int i = k + ; i <= n; ++i) np[++num] = p[i] - p[k];
sort(np + , np + + num, ang);
sum.empty();
for(int i = ; i <= num; ++i)
{
ans += sum * np[i];
sum.x += np[i].x;
sum.y += np[i].y;
}
}
printf("%lld.%d", ans >> , (ans & ) ? : );
}
BZOJ 1132 Tro的更多相关文章
- [POI 2008][BZOJ 1132]Tro
这题我真是无能为力了 这题的做法还是挺简单的 枚举左下角的点做为原点,把其余点按极角排序 PS.是作为原点,如枚举到 k 时,对于所有 p[i] (包括p[k]) p[i]-=p[k] (此处为 ...
- BZOJ.1132.[POI2008]Tro(极角排序)
BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- BZOJ 1132 [POI2008]Tro(极角排序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...
- bzoj 1132 POI2008 Tro
大水题=_=,可我想复杂了…… 很裸的暴力,就是加了个小优化…… 叉积求面积 :abs(xi*yj - yi*xj) 所以去掉绝对值,把 xi 和 xj 提出来就可以求和了 去绝对值加个极角排序,每次 ...
- 【刷题】BZOJ 1132 [POI2008]Tro
Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...
- bzoj 1132: [POI2008]Tro 计算几何
题目大意: 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 题解 我们看到了n的范围,于是我们就知道这一定不是一个线性算法 所以我们尝试枚举三角形的一个点,那么我们现 ...
- bzoj 1132 几何
思路:我刚开始算三角形的方法是原点叉积三条边,然后计算每条边向量积的贡献,但是对于同一条线上的点 有时候没有办法抵消掉..... 看网上的思路是对于一个三角形的面积通过两条边的叉积获得,然后枚举一个点 ...
- 【BZOJ】1132: [POI2008]Tro
题意 给\(n(1 \le n \le 3000)\)个点,求所有三角形的面积和. 分析 首先枚举一个点,发现把其它点按照关于这个点的极角排序后第\(i\)个点关于前面\(1\)到\(i-1\)的点组 ...
随机推荐
- js判断是否是大小写,数字等方法
function isEmail(str){ var regu = "^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*))@([a-zA-Z0-9- ...
- Python导入模块方法
import module_name 导入整个模块 from module_name import function_name 导入特定函数 from module_name import funct ...
- 跨域问题和django中实现跨域
跨域问题 1.同源策略(浏览器的安全功能): 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同 2.CORS跨域资源共享 实现CORS通信的关键是服务器,只要服务器实 ...
- linux安装vmware出现kernel-header问题
查看日志文件, cat /tmp/vmware-xiuyuan/vmware-modconfig-9996.log | more在日志文件中有这么几行:Setting header path for ...
- CMSIS-DAP仿真器_学习(转载)
先给大家普及一下,哈哈.CMSIS-DAP仿真器,是ARM官方做的开源仿真器,没有版权,自由制作.官方给的源代码,使用的是NXP的单片机LPC4320做的.这个源代码,只要你安装了KEIL5,就可以找 ...
- vim编辑器最简单使用方法
i 输入模式 :q 不保存退出 :q! 强制退出 :wq 保存退出 j 下 k 上 h 左 l 右 gg start G end x 往后删 X 往前删 yy 复制行 p 粘贴 dd 剪切行 u 撤销 ...
- Redis实现之事件
事件 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事情: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对 ...
- Careercup - Microsoft面试题 - 5799446021406720
2014-05-12 07:17 题目链接 原题: Given below is a tree/trie A B c D e F a<b<e<>>c<>d&l ...
- Struts之准备工作
*Struts之需要准备的jar包: *Struts之xml配置文件: <?xml version="1.0" encoding="UTF-8"?> ...
- noip 2018 d2t1 旅行
noip 2018 d2t1 旅行 (题目来自洛谷) 给定n个城市,m条双向道路的图, 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路 ...