bzoj1132[POI2008]Tro 计算几何
1132: [POI2008]Tro
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 1722 Solved: 575
[Submit][Status][Discuss]
Description
平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000
Input
第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]
Output
保留一位小数,误差不超过0.1
Sample Input
0 0
1 2
0 2
1 0
1 1
Sample Output
HINT
看见题一眼知道怎么做,然后排序挂了,调了好久
计算面积可以通过叉积前缀的形式来求和,但是叉积求出的是有向面积,所以必须处理abs的问题
怎么处理呢?让所有的叉积都>0是最好的处理方法,可以通过排序来实现
枚举点i,再枚举i之前的点与i构成i-1个向量,对这些向量排序使得标号大的向量叉积标号小的一定>0,并动态统计这些向量的前缀和即可
但是有可能出现问题:
如果一开始点是无序的,很混乱,那么可能会出现以这种情况
for example
4
-5 3
6 -3
4 -6
-2 2
辣么,在处理最后一个点的时候,会出现排序紊乱的情况
我想了一下,发现了原因:(-5,3)与(-2,2) (4,-6)与(2,2) 这两条线段构成的角,从(-4,6)逆时针转上去,形成了一个钝角。。
于是我们需要把每次枚举的i点设置为原点,使得处理它时,所有要被计算的点在同一象限
说起来很麻烦,实际就是按照横纵坐标排个序
其实这个题还挺水的。
#include<bits/stdc++.h>
#define N 3005
#define ll long long
using namespace std;
int n,tp;ll ans;
struct point{
int x,y;
point operator - (const point &b)const{return (point){x-b.x,y-b.y};}
point operator + (const point &b)const{return (point){x+b.x,y+b.y};}
}a[N],q[N];
ll crs(point a,point b){return (ll)a.x*b.y-(ll)a.y*b.x;}
bool cmp1(point x,point y){return x.x==y.x?x.y<y.y:x.x<y.x;}
bool cmp2(point x,point y){return crs(x,y)<;}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+,a++n,cmp1);
for(int i=;i<=n;i++){
point t;t.x=t.y=;tp=;
for(int j=;j<i;j++)
q[++tp]=a[j]-a[i];
sort(q+,q++tp,cmp2);
for(int j=;j<i;j++){
ans+=crs(q[j],t);
t=t+q[j];
}
}
if(ans&)printf("%lld.5\n",ans>>);
else printf("%lld.0\n",ans>>);
return ;
}
bzoj1132[POI2008]Tro 计算几何的更多相关文章
- BZOJ1132: [POI2008]Tro
1132: [POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 815 Solved: 211[Submit][Status] ...
- 【bzoj1132】[POI2008]Tro 计算几何
题目描述 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 输入 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000] 输出 保留 ...
- 【计算几何】【极角序】【前缀和】bzoj1132 [POI2008]Tro
把点按纵坐标排序,依次枚举,把它作为原点,然后把之后的点极角排序,把叉积的公式稍微化简一下,处理个后缀和统计答案. #include<cstdio> #include<cmath&g ...
- bzoj 1132: [POI2008]Tro 计算几何
题目大意: 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 题解 我们看到了n的范围,于是我们就知道这一定不是一个线性算法 所以我们尝试枚举三角形的一个点,那么我们现 ...
- BZOJ1132: [POI2008]Tro(叉积 排序)
题意 世上最良心题目描述qwq 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Sol 直接模拟是$n^3$的. 考虑先枚举一个$i$,那么我们要算的就是$\sum_ ...
- 【BZOJ1132】[POI2008]Tro 几何
[BZOJ1132][POI2008]Tro Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000 ...
- BZOJ_1132_[POI2008]Tro_计算几何
BZOJ_1132_[POI2008]Tro_计算几何 Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3 ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
随机推荐
- centos 开放端口
1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...
- thinkphp中的常见静态常亮
thinkphp __PUBLIC__的定义 __ROOT__等常量的定义 1 2 3 4 5 6 7 8 9 '__TMPL__' => APP_TMPL_PATH, // 项目 ...
- thinkphp中定义自己的函数
可以在前台和后台的公共文件夹中common.php中定义自己的函数,这样就可以在控制器中调用,而不需要调用对象了 /** * @name addvtorandp * @author 黄峰1664253 ...
- Aache的虚拟主机配置虚拟目录
3. 打开 httpd.conf 文件, 添加如下代码: # Virtual hosts Include conf/extra/httpd-vhosts.conf 如果已存在,将Include前面的# ...
- 使用Python3爬虫抓取网页来下载小说
很多时候想看小说但是在网页上找不到资源,即使找到了资源也没有提供下载,小说当然是下载下来用手机看才爽快啦! 于是程序员的思维出来了,不能下载我就直接用爬虫把各个章节爬下来,存入一个txt文件中,这样, ...
- “认证发布”和“获取展示”,如何在 SharePoint 中正确使用 RSS Feed。
在我们进行的日常工作中,是由一部分信息需要 Share 给其他人或者组织的.SharePoint 虽然支持在某个 Site Collection 中互通信息,但是跨 Site Collection 的 ...
- JMeter入门(03)多台JMeter联合测试
一.配置各个节点 1.配置jmeter.properties # Remote Hosts - comma delimited#remote_hosts=localhost:1099,localhos ...
- 配置ssh无密钥登陆
ssh 无密码登录要使用公钥与私钥. linux下可以用用ssh-keygen生成公钥/私钥对,下面以CentOS为例. 有机器LxfN1(192.168.136.128),LxfN2(192.168 ...
- 初学Java Web(9)——学生管理系统(简易版)总结
项目开始时间:2018年4月8日14:37:47 项目完成时间:2018年4月9日10:03:30 技术准备 这个项目是自己用于巩固 J2EE 相关知识的练手项目,非常简单,但是相关的功能却非常实用, ...
- XPath 轴
XML 实例文档 我们将在下面的例子中使用此 XML 文档: <?xml version="1.0" encoding="ISO-8859-1"?> ...