题目大意:

平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000

题解

我们看到了n的范围,于是我们就知道这一定不是一个线性算法

所以我们尝试枚举三角形的一个点,那么我们现在要对每一个点i,求

\(\sum_{j,k \neq i}(\overrightarrow{p_ip_j})*(\overrightarrow{p_ip_k})\)

其中*表示叉积

然后我们发现这是一个对二元对的某种操作求和的一种

我们可以想到将其转化为

\[\sum_{j,k \neq i}abs((\overrightarrow{p_ip_j})*\sum(\overrightarrow{p_ip_k}))
\]

我们拆开叉积的表达式即\(x_1*y_2 - y_1*x_2\)我们发现是可以这么拆的

但是我们每次累加的时候实际上是取abs的,所以实际上并不能这么加

所以我们尝试拆开abs

我们发现只要我们用一个恰当的顺序枚举j,k就可以不用取abs即可

所以可以做到\(O(n^2logn)\)瓶颈在于极角排序

#include <cstdio>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 3010;
const double eps = 1e-9;
struct Point{
ll x,y;
double k;
Point(const ll &a=0,const ll &b=0){x=a;y=b;}
};
inline bool cmp1(const Point &a,const Point &b){
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
inline bool cmp2(const Point &a,const Point &b){
return a.k < b.k;
}
typedef Point Vector;
inline Vector operator + (const Vector &a,const Vector &b){
return Vector(a.x + b.x,a.y + b.y);
}
inline Vector operator - (const Vector &a,const Vector &b){
return Vector(a.x - b.x,a.y - b.y);
}
inline ll cross(const Vector &a,const Vector &b){
return a.x*b.y - a.y*b.x;
}
Point s[maxn],p[maxn];
int cnt = 0;
int main(){
int n;read(n);
for(int i=1;i<=n;++i){
read(p[i].x);read(p[i].y);
}sort(p+1,p+n+1,cmp1);
ll ans = 0;
for(int i=1;i<=n;++i){
cnt = 0;
for(int j=i+1;j<=n;++j){
s[++cnt] = p[j] - p[i];
if(p[j].x == p[i].x) s[cnt].k = 1e10;
else s[cnt].k = (double)(p[i].y - p[j].y)/(double)(p[i].x - p[j].x);
}sort(s+1,s+cnt+1,cmp2);
Point sum;
for(int j=cnt;j>=1;--j){
ans += cross(s[j],sum);
sum = sum + s[j];
}
}printf("%lld.",ans>>1);
if(ans & 1) puts("5");
else puts("0");
getchar();getchar();
return 0;
}

并且在做题的时候发现了一些有趣的事情

long long x = 100000000000000;
printf("%d\n",((long long)((double)x)) == x);

会输出0哈哈哈哈哈哈哈哈哈哈哈哈

为了这个lz拍了30mins的标程。。。

bzoj 1132: [POI2008]Tro 计算几何的更多相关文章

  1. bzoj 1132 [POI2008]Tro 几何

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

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

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

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

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

  4. bzoj 1132 POI2008 Tro

    大水题=_=,可我想复杂了…… 很裸的暴力,就是加了个小优化…… 叉积求面积 :abs(xi*yj - yi*xj) 所以去掉绝对值,把 xi 和 xj 提出来就可以求和了 去绝对值加个极角排序,每次 ...

  5. 【刷题】BZOJ 1132 [POI2008]Tro

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

  6. bzoj1132[POI2008]Tro 计算几何

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

  7. 【BZOJ】1132: [POI2008]Tro

    题意 给\(n(1 \le n \le 3000)\)个点,求所有三角形的面积和. 分析 首先枚举一个点,发现把其它点按照关于这个点的极角排序后第\(i\)个点关于前面\(1\)到\(i-1\)的点组 ...

  8. 【bzoj1132】[POI2008]Tro 计算几何

    题目描述 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 输入 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000] 输出 保留 ...

  9. BZOJ1132: [POI2008]Tro

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

随机推荐

  1. python高级语法进阶

    python中几个比较难懂概念进阶. 迭代器 实现了迭代器协议的容器对象,基于如下两个方法: __next__:返回容器的下一个元素 __iter__:返回迭代器本身 由此可见,如果要自定义一个迭代器 ...

  2. IIS架构介绍

    IIS7及以上版本提供的请求-处理架构包括以下内容: Windows Process Activation Service(WAS)可以让站点支持更多协议,不仅仅是HTTP和HTTPS 可以通过增加或 ...

  3. mysql导出数据或结构

    导出整个数据库结构和数据 $ mysqldump -h localhost -uroot -p123456 database > dump.sql 导出单个数据表结构和数据 $ mysqldum ...

  4. CENTOS7 修改网卡名称为eth[012...],格式

    具体操作是修改/etc/default/grub文件 在GRUB_CMDLINE_LINUX一行中添加net.ifnames=0 biosdevname=0 保存文件后然后运行 grub2-mkcon ...

  5. 每天一个Linux命令(26)chown命令

          chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.     (1)用法:     用法:  chown [选项 ...

  6. Data Structure Binary Tree: Check if a given Binary Tree is SumTree

    http://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-sumtree/ #include <iostream> #inc ...

  7. <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码

    题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的! (下文中的内核源码都来自于 kernel ...

  8. hihocoder 1142 三分求极值【三分算法 模板应用】

    #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...

  9. LINQ 学习路程 -- 查询操作 where

    1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...

  10. fffmpeg 提取pcm

    ffmpeg -i input.aac -codec:a pcm_f32le -ar 48000 -ac 2 -f f32le output.pcm