题目大意:

平面上有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. GS与MS之间通信

    GS与MS之间通信 注意GS与MS是两个线程,现在是每个map一个线程,他们之间是内部协议进行通信的,那既然是两个线程那如何通信呢,看了net进程通信这个就比较简单了 举个例子 m_pMap-> ...

  2. 安装部署服务器和javaweb项目

    [说明]总算告一段落了,服务器啊服务器,你可是把我折磨的够呛,不过现在的状态我已经很满足了. [说明]下面的图片是我这两天一直在搞的,内容不能说是重复,只能说是不停地修改修改,出错出错. 1) 虚拟主 ...

  3. ElasticSearch(二十)定位不合法的搜索及其原因

    GET /test_index/test_type/_validate/query?explain { "query": { "math": { "t ...

  4. PAT 1065. 单身狗(25)

    “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数:随后N行 ...

  5. Nodejs课堂笔记—第一课:修改Webstorm的默认主题

    最近小半年一直在忙于研究Docker源码,也在写相关的分析文章.但受限于某些条件不能发布到网上,甚为郁闷.而最近几天,接到新的开发任务,需要使用nodejs.之前一直听说过nodejs,但从来没有真正 ...

  6. mysql 中 all any some 用法

    -- 建表语句 CREATE TABLE score( id INT PRIMARY KEY AUTO_INCREMENT, NAME ), SUBJECT ), score INT); -- 添加数 ...

  7. 每天一个Linux命令(24)tar命令

        tar命令可以为linux的文件和目录创建档案.     (1)用法: 用法:  tar  [选项]   [文件参数]     (2)功能:     功能:  用来压缩和解压文件.tar本身不 ...

  8. Data Structure Linked List: Detect and Remove Loop in a Linked List

    http://www.geeksforgeeks.org/detect-and-remove-loop-in-a-linked-list/ #include <iostream> #inc ...

  9. P4844 LJJ爱数数

    题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...

  10. AJAX请求时status返回状态明细表

    AJAX请求时status返回状态明细表 readyState的五种状态2010-03-04 18:24对于readyState的五种状态的描述或者说定义,很多Ajax书(英文原版)中大都语焉不详 在 ...