题目大意:

平面上有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. sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

  2. 【BZOJ2806】[Ctsc2012]Cheat 广义后缀自动机+二分+单调队列优化DP

    [BZOJ2806][Ctsc2012]Cheat Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的 ...

  3. 【HTML5开发系列】DOM及其相关

    对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.DOM把Javascript和HTML文档的结构和内容连接起来,通过DOM可以控 ...

  4. Wrapper配置详解及高级应用

      将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂,甚至可以认为非常简单.但是实际项目应用过程中我们的程序一般较庞大,运行环境也较复杂. 通过Wrapper 配置文件 ...

  5. 获取exe文件窗口抓图,将memo转化为JPG输出

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  6. go语言之接口一

    在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 我们定义了一个File类,并实现有Read().Write().Seek().Close()等方法.设 想我们有如下接口 ...

  7. R语言数据管理(二):模式与类

      最常用的4种数据类型是数值型(numeric).字符型(character)(字符串).日期型(Date)或POSIXct(基于日期的).逻辑型(logical)(TRUE或FALSE). 变量中 ...

  8. strstr使用

    extern char strstr(char str1, const char *str2); 语法: strstr(str1,str2) str1: 被查找目标 string expression ...

  9. python基础9 -----python内置函数2

    一.python内置所以函数     Built-in Functions     abs() divmod() input() open() staticmethod() all() enumera ...

  10. AbstractQueuedSynchronizer(一)

    应该将子类定义为非公共内部帮助器类,一般并发包类用内部类Sync sync来继承并实现.为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架.此类的设计目 ...