bzoj1132 [POI2008]Tro

原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1132

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

数据范围
N在[3,3000] ,N个点的坐标值在[0,10000]
保留一位小数,误差不超过0.1

题解:
好题。
我想了两种做法,
第一种:考虑一般求多边形面积的方法。

S=S蓝1+S蓝2-S红
其实就是计算每条边的贡献。
对于x以右的点极角排序,
ab 这样的边贡献+1
(保存一个两两边贡献的后缀和)
x与a这样的点连边的贡献就(前面的点的个数-后面的点的个数)

正解:
考虑叉积到底是个什么。
x1y2-x2y1
如果a对于x的坐标(x1,y1),b对于x的坐标(x2,y2)
提个公因数,
x1贡献 ∑y2
y1贡献-∑x2

因为要用叉积算,要保证>0,于是让它有序就行。
先按x排序,枚举每个点,他之右的极角排序,然后存个前缀和算。


一个困扰我很久的点:
第一遍排序:bool cmp1(const Poi &A,const Poi &B){return A.x<B.x;}
结果:WA
第一遍排序:bool cmp1(const Poi &A,const Poi &B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
结果:AC

一组数据:
(10,1)(10,2)(10,3) ,(15,2)
正确答案是10.0
但对于第一种排序,显然它对于前三个点的顺序不作要求,
当顺序为:(10,2)(10,3) (10,1),(15,2)时,
答案为 5.0,错了!!!
而对称的(10,2)(10,1) (10,3),(15,2)
答案则是正确的 10.0
为什么?感谢Doggu非常耐心的答疑。
打印出过程发现,同样第一个数取(10,2),那么剩下三个点对于他的坐标分别为:
(5,0)(0,1)(0,-1)
第一种的极角排序:(0,-1)(0,1)(5,0)
正常的极角排序:(0,-1)(5,0)(0,1)
极角排序不对!!!
考虑到我们为了追求常数小,比较极角用的不是atan2,而是叉积:

bool cmp2(const Poi &A,const Poi &B){return A.x*B.y-B.x*A.y>0;}

那么对于(0,-1)和(0,1)他们的叉积为0,其实是互相小于的,一旦比较顺序不对,排序就不对。

因此必须按x为第一关键字,y为第二关键字排,才不会出现这种上下都有的情况。

下次用叉积也要小心了。


代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int N=3005;
struct Poi
{int x,y;Poi(){}Poi(int x,int y):x(x),y(y){}
}P[N],v[N];
Poi operator-(const Poi &A,const Poi &B){return Poi(A.x-B.x,A.y-B.y);}
bool cmp1(const Poi &A,const Poi &B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
bool cmp2(const Poi &A,const Poi &B){return A.x*B.y-B.x*A.y>0;}
int n;
LL ret=0;
void solve()
{sort(P+1,P+n+1,cmp1);for(int i=1;i<n-1;i++){int cnt=0; LL sx=0,sy=0;for(int j=i+1;j<=n;j++){v[++cnt]=P[j]-P[i];}sort(v+1,v+cnt+1,cmp2);for(int j=1;j<=cnt;j++){       ret-=1LL*v[j].x*sy;ret+=1LL*v[j].y*sx;sx+=v[j].x; sy+=v[j].y;}}printf("%lld.%lld\n",ret>>1,5LL*(ret&1));
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d%d",&P[i].x,&P[i].y);solve();return 0;
}

bzoj1132 [POI2008]Tro(叉积)相关推荐

  1. bzoj1132:[POI2008]Tro

    [传送门])(https://www.lydsy.com/JudgeOnline/problem.php?id=1132) 自己的计算几何还是挺渣的呢. 其实只要考虑一下叉积的式子就可以想到前缀和了, ...

  2. BZOJ1132: [POI2008]Tro

    所以为啥用long long本地能过所有数据交上去就WA,一定要改int啊 一开始写了个用点到直线距离公式的,维护两个指针扫过去 emmmmmm并不能过样例,因为有根号什么的东西,调不动-. 膜题解发 ...

  3. [BZOJ1132][POI2008]Tro(计算几何)

    题目描述 传送门 题目大意:平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和. 题解 枚举每一个点,以它为原点建立平面直角坐标系,然后其他的点按照极角排序. 向量的叉积满足分配律,所以可以t ...

  4. bzoj1132 [POI2008]Tro

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

  5. 【BZOJ1132】[POI2008]Tro 几何

    [BZOJ1132][POI2008]Tro Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000 ...

  6. bzoj 1132: [POI2008]Tro

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

  7. [POI2008]Tro

    题面 <center>2042: [POI2008]Tro<center> <center>时间限制:20秒 内存限制:162MB<center> 题目 ...

  8. 【bzoj1132】[POI2008] Tro

    水题,用来巩固一下叉积. cross(u,v)=xuyv−xvyucross(u,v)=x_uy_v-x_vy_u,其除以2就是u⃗ \vec{u}到v⃗ \vec{v}形成的有向面积.如果保证v在u ...

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

    按照横坐标为第一关键字,纵坐标为第二关键字排序, 枚举每个点作为原点 把再它后面的点拿出来,求每一对点与原点构成的三角形的面积 abs(a[i].x*a[j].y-a[i].y*a[j].x) 如果能 ...

最新文章

  1. JDeodorant 的使用
  2. 获取mongodb数据变更_支持mysql、MongoDB数据变更订阅/监听分发
  3. 一个java文件中可包含多个main方法
  4. python2和python3解释器的区别
  5. 实战 | 尝鲜 Svelte 前端框架,开发读书笔记
  6. leetcode-453-Minimum Moves to Equal Array Elements
  7. 从 C10K 到 C500K
  8. Music 环形界面的算法记录
  9. realtime multi-person 2D pose estimation using part affinity fields
  10. uni-app之实现分页
  11. 【解题报告】表达式求值(栈,表达式树)
  12. CTP: 各种错误的测试(补充和修改中)
  13. TTF字体文件内容获取
  14. LaTeX快速入门(超详细~)
  15. mysql全称量词_数据库基础lt;三)标准语言SQL-一团网
  16. 概率统计及其应用第三章知识总结_高中数学130分,知识点最全总结,高分必看!...
  17. linux删除文件名的文件夹,Linux删除文件夹和修改文件名
  18. 搭建资金运营体系提高企业的运营能力
  19. Android 权限 翻译
  20. iview form表单验证手机号

热门文章

  1. 欢乐上墙使用简易教程 + 详细教程
  2. 计算机软件著作权申请
  3. data fastboot 擦除_Fastboot的使用简单教程
  4. 性能测试分析与性能调优诊断--史上最全的服务器性能分析监控调优篇
  5. 新版 App Store 的副标题和宣传文本
  6. PHP调用微信接口现金红包功能
  7. python爬取百思不得姐视频
  8. 京东的热搜(搜索)界面(GreenDao,EventBus,Butterknife)
  9. 友情链接在html中怎么写,用描文本、友情链接交易方式教你如何制作网页链接...
  10. java实现人员排日程